@jarroba/mcp
MCP server (stdio, local) exposing 137 deterministic tools from Jarroba Tools, reusing the same code as the web app: read a CI log that does not fit in your context, audit tests, simulate make, run SQL against an ephemeral PostgreSQL, SPARQL, JTD diagrams
npm · fingerprint da19e1ada14fa647338ed523 · repository · RSS
What changed
Changed 2026-10-19 13:07 UTC
5 descriptions rewritten, 2 schema or annotation changes with the description left byte-identical, 3 tools added.
--- pinned/access_check +++ observed/access_check { "annotations": { "destructiveHint": false, + "requestContext": { + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + "description": "AWS only: the request context, so Condition blocks are evaluated instead of left indeterminate, e.g. {\"aws:SourceIp\": \"10.1.2.3\", \"aws:PrincipalTag/team\": \"data\", \"aws:MultiFactorAuthPresent\": \"true\"}", + "type": "object" + }, "scopeId": { "type": "string" },
+ tool added: csv_diff
--- pinned/headers_audit +++ observed/headers_audit { "annotations": { "destructiveHint": false, - "description": "Audit the HTTP response headers of a site as you pasted them (from curl -I, DevTools or a HAR): Content-Security-Policy (missing, unsafe-inline/eval, wildcards, missing object-src/base-uri/frame-ancestors), HSTS (missing, too short, invalid preload), nosniff, frame options, Referrer-Policy, the obsolete X-XSS-Protection, cookies without Secure/HttpOnly/SameSite, and a Server header that exposes the version. Nothing is requested over the network: it reads what you give it.", + "description": "Audit the HTTP response headers of a site as you pasted them (from curl -I, DevTools or a HAR): an A+…F grade like /headers-audit; Content-Security-Policy (missing, unsafe-inline/eval, wildcards, missing object-src/base-uri/frame-ancestors), HSTS (missing, too short, invalid preload), nosniff, frame options, Referrer-Policy, the obsolete X-XSS-Protection, cookies without Secure/HttpOnly/SameSite, and a Server header that exposes the version. Nothing is requested over the network: it reads what you give it.", "execution": { "taskSupport": "forbidden" },
--- pinned/k8s_manifest_check +++ observed/k8s_manifest_check { "annotations": { "destructiveHint": false, - "description": "Will the cluster accept these Kubernetes manifests? Validates them against the OFFICIAL schema of the Kubernetes version you target (1.33–1.37; checked against kubeconform --strict): unknown fields with the one you probably meant (a typo in livenessProbe silently leaves the pod without a probe), wrong types (\"80\" where an integer goes), missing required fields, removed APIs with what to migrate to. And Pod Security Standards, ported from the official admission controller: the highest level each workload meets, what it violates (the controller's own check ids), and whether its namespace's pod-security.kubernetes.io labels would reject it. If you include RBAC (Roles, Bindings, ServiceAccounts), what each pod could do if compromised: read secrets, exec into pods, escalate…. Not covered: CEL rules, formats, CRDs (reported as not validated). For who-can-reach-whom, use k8s_network_reach.", + "description": "Will the cluster accept these Kubernetes manifests? Validates them against the OFFICIAL schema of the Kubernetes version you target (1.33–1.37; checked against kubeconform --strict): unknown fields with the one you probably meant (a typo in livenessProbe silently leaves the pod without a probe), wrong types (\"80\" where an integer goes), missing required fields, removed APIs with what to migrate to. And Pod Security Standards, ported from the official admission controller: the highest level each workload meets, what it violates (the controller's own check ids), and whether its namespace's pod-security.kubernetes.io labels would reject it. If you include RBAC (Roles, Bindings, ServiceAccounts), what each pod could do if compromised: read secrets, exec into pods, escalate…. And reliability checks in the style of kube-score (probes, resources, :latest images, replicas without a PodDisruptionBudget…), which do not affect acceptance. Not covered: CEL rules, formats, CRDs (reported as not validated). For who-can-reach-whom, use k8s_network_reach.", "execution": { "taskSupport": "forbidden" },
--- pinned/log_analyze +++ observed/log_analyze { "annotations": { "destructiveHint": false, - "description": "Understand a log without reading it: detected format, number of EVENTS (a 40-line stack trace counts as one), breakdown by level, time range, the errors with their ROOT CAUSE resolved, and the most frequent patterns. Accepts a file PATH — that is how you look at a log that does not fit in your context, such as a CI log of hundreds of MB.", + "description": "Understand a log without reading it: detected format, number of EVENTS (a 40-line stack trace counts as one), breakdown by level, time range, the errors with their ROOT CAUSE resolved, and the most frequent patterns. Accepts a file PATH — that is how you look at a log that does not fit in your context, such as a CI log of hundreds of MB. Logs WRAPPED by whatever collected them (Docker json-file, CRI/Kubernetes `P`/`F` lines, `journalctl -o json`, OpenTelemetry OTLP JSON, AWS CloudTrail) are unwrapped first and the pieces the runtime split are joined back, so a stack trace spread over 40 records is one event; `wrapper` says which.", "execution": { "taskSupport": "forbidden" },
+ tool added: log_distinguish
--- pinned/make_generate +++ observed/make_generate { "annotations": { "destructiveHint": false, - "description": "Generate a ready-to-use Makefile for a stack (node, python, go, rust, c or generic). What it generates PASSES its own linter with zero findings: it always ships `.DELETE_ON_ERROR`, `SHELL := /bin/bash` with `.SHELLFLAGS := -eu -o pipefail -c`, and declared `.PHONY` targets — the three lines that are almost never there and that prevent the most expensive failures. With `withLogs`, targets record their output through `tee`, redirect stderr, timestamp the file name, and take the log directory as an order-only prerequisite.", + "description": "Generate a ready-to-use Makefile for a stack (node, python, go, rust, c, maven, gradle or generic). What it generates PASSES its own linter with zero findings: it always ships `.DELETE_ON_ERROR`, `SHELL := /bin/bash` with `.SHELLFLAGS := -eu -o pipefail -c`, and declared `.PHONY` targets — the three lines that are almost never there and that prevent the most expensive failures. With `withLogs`, targets record their output through `tee`, redirect stderr, timestamp the file name, and take the log directory as an order-only prerequisite.", "execution": { "taskSupport": "forbidden" }, - "generico", + "generic", "node", "python", "go", - "c" + "c", + "maven", + "gradle", + "generico" ], "type": "string" },
--- pinned/rabbit_route +++ observed/rabbit_route { "annotations": { "destructiveHint": false, - "description": "Which queues a RabbitMQ exchange delivers a message to, and why each binding matches or not: direct, topic (* and # words), fanout and headers (x-match all/any/all-with-x/any-with-x). Ported from RabbitMQ 4.0.5 and checked against its own tests. Unroutable means the message is dropped (or returned with mandatory). One difference: in headers, 1 and 1.0 are different values in RabbitMQ and equal here.", + "description": "Which queues a RabbitMQ exchange delivers a message to, and why each binding matches or not: direct, topic (* and # words), fanout and headers (x-match all/any/all-with-x/any-with-x). Ported from RabbitMQ and calibrated against real 4.0.5 and 4.3.6 brokers (thousands of seeded cases, all equal). Unroutable means the message is dropped (or returned with mandatory). One difference: in headers, 1 and 1.0 are different values in RabbitMQ and equal here.", "execution": { "taskSupport": "forbidden" }, + }, + "version": { + "description": "Broker line (default 4.3): from 4.3.5 a topic binding with more than two # is rejected", + "enum": [ + "4.0", + "4.3" + ], + "type": "string" } }, "required": [
+ tool added: sns_filter
--- pinned/spreadsheet_audit +++ observed/spreadsheet_audit { "annotations": { "destructiveHint": false, - "idempotentHint": true, - "openWorldHint": false, + "idempotentHint": false, + "openWorldHint": true, "readOnlyHint": true }, "description": "Audit a spreadsheet file (.xlsx, .xlsm, .ods, .xls) by RECALCULATING every formula and comparing it with the value saved in the file: cells whose saved value no longer matches its formula (stale or hand-overwritten results), real circular references, functions the recalculation engine does not support, and formula errors. Returns only the problem cells, each with sheet, address, formula, saved and recalculated value; healthy formulas are just counted. Reads the file from disk: pass its path.",
Changed 2026-10-09 13:24 UTC
1 description rewritten, 1 schema or annotation change with the description left byte-identical, 6 tools added.
--- pinned/cedar_check +++ observed/cedar_check { "annotations": { "destructiveHint": false, - "description": "Check Cedar authorization policies (the language of AWS Verified Permissions) with the official Cedar engine, instead of reasoning about them: parse errors with their location; validation against your schema if you give one (wrong attribute, wrong entity type, impossible conditions); and, for each request, allow or deny with the policies that decided it — so you can tell a missing permit from a forbid that wins, and see a forbid that errored and so did not apply (fails open). Policies may carry @id(\"…\") to name them in the answer.", + "description": "Check Cedar authorization policies (the language of AWS Verified Permissions) with the official Cedar engine, instead of reasoning about them: parse errors with their location; validation against your schema if you give one (wrong attribute, wrong entity type, impossible conditions), and of your entities against it; and, for each request, allow or deny with the policies that decided it — so you can tell a missing permit from a forbid that wins, and see a forbid that errored and so did not apply (fails open). Policies may carry @id(\"…\") to name them in the answer.", "execution": { "taskSupport": "forbidden" },
+ tool added: chem_ph
+ tool added: chem_solubility
+ tool added: chem_titration
+ tool added: kafka_assign
+ tool added: kafka_partition
--- pinned/practice_check +++ observed/practice_check { "annotations": { "destructiveHint": false, + "area": { + "description": "Without topic: list every entry of this area (id, title, verdict; ~2,000 tokens) to scan it yourself", + "enum": [ + "ai", + "development", + "web", + "security", + "data", + "infrastructure" + ], + "type": "string" + }, "since": { "description": "Your knowledge cutoff: YYYY, YYYY-MM or YYYY-MM-DD", "pattern": "^\\d{4}(-\\d{2}(-\\d{2})?)?$", - "required": [ - "topic" - ], "type": "object" }, "name": "practice_check"
+ tool added: rabbit_route
Current tools
Show all 137 tool fingerprints
Watch this server yourself
If you run this server, put the proxy in front of it. It pins these exact fingerprints on first connect and stops the session if they move.
npx -y mcp-pin@0.2.3 -- <your @jarroba/mcp command>
Or subscribe to this page's RSS feed to be told when it changes.
Badge
The badge states one fact about time and nothing else. It never claims a server is safe.
[](https://mcp-pin.gautamkhosla.com/servers/8c3a83bda8977be4.html)