indykite-agent-gateway — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited indykite-agent-gateway (Agent Skill) and scored it 91/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 1 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 flagged
The text {match} is the classic direct prompt-injection phrasing. Placed in a skill body that the agent reads as trusted instructions, it tries to make the agent abandon its prior rules and follow whatever comes next — a full system-prompt override.
ignore/disregard/forget … previous instructions sentence.Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
The Indykite Agent Gateway (IAG) is a standalone service that protects exactly one downstream - an A2A agent or an MCP server. Deploy one IAG per protected downstream. From the caller's perspective IAG appears as the Target; from the protected downstream's perspective IAG appears as the Source. IAG is not a generic reverse proxy: by default (protocol: a2a) it speaks the A2A protocol and tracks A2A sessions so JSON-RPC streams flow correctly; with protocol: mcp it proxies MCP Streamable HTTP traffic (forwarding Mcp-Session-Id and streaming SSE responses through). Either way the same authorization runs in front.
For each request IAG validates three things:
CAN_TRIGGER check via AuthZEN/KBAC).act chain matches a chain modeled in the IKG).Activate this skill when the user:
protocol: mcp) so MCP traffic gets the same introspection, AuthZEN check, and audit as A2A;act chain;Workflow and Agent nodes with INVOKES relationships in the IndyKite Graph (IKG);JARVIS_* environment variables or a config.yaml for one or more IAG instances;AUTHORIZED / NOT_AUTHORIZED) and trying to explain a 403;iag-demo (A2A) or iag-mcp-demo (A2A + MCP) reference applications.Do not activate this skill when the user:
Before any of the steps below will succeed, the user needs:
Workflow node and Agent nodes already modeled (or a plan to model them - see Step 1).IDP_BASE_URL to the IdP base for the target environment.(workflow, agent_list) pairs for each protected downstream - its query_id goes into IAG configuration.protocol: mcp): the MCP server's origin and endpoint path, and the gateway image indykite/agent-gateway ≥ 2.0.1 (older images ignore the protocol and behave as an A2A proxy). MCP clients typically authenticate with an App Agent token, which must be introspectable and pass the AuthZEN check.If any of these are missing, stop and tell the user - IAG cannot run without them.
Create one Workflow node identified by external_id, one Agent node per protected agent, and INVOKES relationships between agents. Every INVOKES relationship must carry a workflow_name property whose value matches the Workflow.external_id. The ContX IQ query in step 3 silently excludes any chain without it.
Example shape (the canonical wf1 workflow from the demo):
(Workflow {external_id: "wf1"})
(Agent {external_id: "orchestrator"})
-[INVOKES {workflow_name: "wf1"}]-> (Agent {external_id: "retriever"})
(Agent {external_id: "orchestrator"})
-[INVOKES {workflow_name: "wf1"}]-> (Agent {external_id: "weather"})Capture this data through the Capture API (POST /capture/v1/nodes, POST /capture/v1/relationships), the IndyKite Hub UI, or an existing Terraform / identity pipeline - whichever the project already uses.
For every subject that is allowed to trigger the workflow, create the edge (:User)-[:CAN_TRIGGER]->(:Workflow) (or the equivalent AuthZEN relation). Without this edge IAG returns 403 at the AuthZEN check even if the chain is correct.
The query must return (workflow, agent_list) pairs given a protected agent identifier, where agent_list is the ordered chain of agents the request must traverse. Save its query_id - IAG references it via JARVIS_CONTX_IQ_QUERY_ID (or contx_iq.query_id).
Pick one of the two configuration forms:
--config=/app/config.yaml. Best for production where configuration management is strict. See assets/config-template.yaml in this skill.JARVIS_ prefix with underscores (e.g. JARVIS_SERVICE_NAME). Best for Docker Compose deployments where multiple IAG instances share a base image and override only per-agent fields.The full set of sections is service, identity_provider, protected_agent, authzen, contx_iq, and audit. See references/configuration.md for every field and its default.
Pick the downstream protocol with protected_agent.protocol (env JARVIS_PROTECTED_AGENT_PROTOCOL): a2a (default) for an A2A agent, mcp for an MCP server. Any other value fails startup with invalid protected_agent protocol. In mcp mode protected_agent.base_url is the MCP server origin only - IAG appends the incoming request path. The authorization sequence is unchanged; only the forwarded protocol differs. See the Protecting an MCP server section of references/configuration.md.
Per-instance values that must differ between IAG instances:
service.name / JARVIS_SERVICE_NAMEservice.port / JARVIS_SERVICE_PORTprotected_agent.base_url / JARVIS_PROTECTED_AGENT_BASE_URLprotected_agent.protocol / JARVIS_PROTECTED_AGENT_PROTOCOL (if any instance protects an MCP server)protected_agent.authentication.client_id and client_secretFor Docker Compose, follow the iag-demo pattern: one shared iag-base-docker.yaml plus one service per protected agent that overrides only the per-instance fields above. For Kubernetes, deploy each IAG as a standalone Pod for independent scaling, or as a sidecar to its protected agent for tighter coupling.
Verify that each IAG can reach the IdP, AuthZEN, ContX IQ, and the protected agent - common deployment failures are network-level, not IAG-level.
Send a request through the gateway and confirm the nine-step path executes end-to-end. The expected HTTP responses are:
200 - request was authorized and forwarded.400 - bad request.401 - caller token missing or inactive.403 - caller authenticated but not allowed (subject, chain, or both).500 - internal error.502 - upstream / gateway-side processing error.Watch service logs (JSON to stdout) and audit records together - service logs explain what IAG did, audit records explain what IAG decided.
Audit records are emitted as a separate stream from service logs. Configure delivery as either:
audit.delivery: webhook, audit.http.url, optional auth (mTLS, api-key, basic, no-auth).audit.delivery: file, audit.storage_path, audit.format (csv, json, txt), audit.rotation_strategy (size, time, size_and_time).Each record contains decision, reason, subject, actor, action, service, timestamp, traceID. The traceID correlates with the protected agent's logs and the upstream client.
To gain confidence that IAG is enforcing as expected, deliberately force NOT_AUTHORIZED outcomes:
retriever-iag directly without the orchestrator in act).INVOKES relationship - ContX IQ stops returning that chain.Each should return 403 Forbidden and produce a NOT_AUTHORIZED audit record with a useful reason.
When this skill has been applied successfully:
Workflow node, the relevant Agent nodes, and INVOKES edges (with workflow_name) exist in the IKG.(workflow, agent_list) pairs for each protected agent.AUTHORIZED audit records on every IAG it touches.403 Forbidden plus a NOT_AUTHORIZED audit record with a human-readable reason.references/architecture.md - the nine-step IAG request path and the IKG data shape.references/configuration.md - every IAG configuration section, field, and default.references/troubleshooting.md - common failure modes mapped to fixes.assets/config-template.yaml - a starter config.yaml to copy and adapt.This skill uses generic markdown instructions and works across all agents listed in the README. It does not require Claude Code hooks, Cursor @-mentions, Copilot workspace context, or any agent-specific feature. Network access (curl, the agent's web tools, or MCP) is needed only if the agent will call IndyKite APIs directly during a task; for setup-only work no special tools are required.
iag-demo reference app - A2A only.iag-mcp-demo reference app - adds an mcp-iag instance (protocol: mcp) protecting the IndyKite MCP server.canbank datasetinitialize, tools/list, tools/call, …).~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.