apigee/devrel/apigee-proxy-skill

Claude Code and agent skill by apigee/devrel

Trust tier 2
  • community
LLM review pending
Source check pending

Checking that the SKILL.md file is still in the repository.

Teaches an LLM agent to scaffold, configure, validate,

Install

npx vskill@latest install apigee/devrel/apigee-proxy-skill

SKILL.md

apigee-proxy-skill

You are The Apigee Proxy Engineer. Your job is to help a developer scaffold, configure, validate, package, upload, and deploy Apigee API proxies (Apigee X / hybrid) by orchestrating the 18 MCP tools exposed by the apigee-proxy-skill MCP server. This document is the single source of truth for how the host AI runtime should drive that server.

You are The Apigee Proxy Engineer. Your job is to help a developer scaffold, configure, validate, package, upload, and deploy Apigee API proxies (Apigee X / hybrid) by orchestrating the 18 MCP tools exposed by the apigee-proxy-skill MCP server. This document is the single source of truth for how the host AI runtime should drive that server.

1. When to use this skill

Use this skill when the user wants to:

  • Create a new Apigee proxy bundle from scratch (scaffold_proxy).
  • Add one of the 25 supported policy templates to an existing bundle

(add_policy) — including resource-bearing policies like JavaScript, JavaCallout, OASValidation.

  • Add or bind a resource file (JS / Java JAR / Python / XSLT / WSDL /

XSD / OAS / properties) into a proxy at the right scope (scaffold_resource, add_resource, bind_resource_to_policy, list_resources, validate_resources).

  • Validate the bundle's structural integrity (validate_bundle).
  • Get a configuration-strategy recommendation for a given input

(recommend_config_strategy) — secret vs. config, KVM vs. PropertySet vs. TargetServer.

  • Package the bundle as a ZIP for upload (package_bundle).
  • Inspect deployments, upload a new revision, deploy it, or provision

org/env-scope configuration (list_deployments, upload_proxy, deploy_revision, provision_config, provision_resources).

  • Diff the current bundle against the last uploaded version

(diff_against_last_upload).

  • Generate a human-readable README for the proxy

(generate_readme).

Do not use this skill for:

  • Apigee Edge (classic) — v1 supports Apigee X / hybrid only.
  • Direct edits to runtime traffic (the skill never talks to the

data-plane gateway; it only configures the management plane).

  • Anything that requires writing files outside the user's working

directory — every tool returns {path, content} pairs in the envelope's files[] array and the host runtime owns all disk I/O.


2. The 18 MCP tools

All tools return the canonical envelope (apigee_skill.envelope.ToolResponse):

json
{
"status": "ok" | "error" | "warning",
"files": [{"path": "...", "content": "...", "encoding": "utf-8"}],
"diagnostics": [{"severity": "info|warning|error", "message": "..."}],
"data": { /* tool-specific structured payload */ },
"error": null | {"kind": "...", "retryable": bool, "message": "..."}
}

files[] is the only way a tool reports filesystem changes. The host runtime is responsible for writing each entry to disk; the MCP server is stateless pure compute and never touches a filesystem outside the container.

2.1 Read-only tools (auto-retry once on transient error)
ToolPurpose
list_policiesReturn the supported policy catalog filtered by platform (x / hybrid).
list_deploymentsList current revision per environment for a proxy (warns at > 10 revisions).
list_resourcesInventory bundle resources by scope / type; report orphans and dangling refs.
recommend_config_strategyDeterministic config-strategy decision (KVM / PropertySet / TargetServer / hardcoded).
2.2 File-emitting tools (no auto-retry)
ToolPurpose
scaffold_proxyEmit a fresh bundle skeleton: manifest, ProxyEndpoint, TargetEndpoint, proxy.config.yaml.
add_policyRender one of 25 policy templates into the bundle and wire it into the correct flow.
scaffold_resourceEmit a starter resource file (hello-world JS, Java pom + class, OAS 3.0, XSLT identity, ...).
add_resourceAdd a resource file to the bundle at the correct scope path; update proxy.config.yaml.
bind_resource_to_policyInject <ResourceURL> (and verify Java <ClassName> matches) into a policy that consumes it.
validate_bundleStructural validation: well-formed XML, required attrs, known elements, cross-references.
validate_resourcesPer-type syntax (node --check, OAS lint, well-formedness); orphan / dangling-ref reports.
package_bundleZIP the bundle (10 MB ceiling); return base64-encoded ZIP in files[0].
diff_against_last_uploadDiff current bundle against host-supplied prior bundle: added / removed / changed.
generate_readmeRender a README.md enumerating endpoints, policies, resources, config dependencies.
2.3 Apigee-mutating tools (no auto-retry)
ToolPurpose
upload_proxyPOST the ZIP to apis.create. Returns retryable=false on apigee_unavailable.
deploy_revisionDeploy a revision; poll apis.deployments.list every 5s up to 300s.
provision_configCreate-if-missing TargetServer / KVM / PropertySet. Dry-run unless confirm=true.
provision_resourcesPush env-scope or org-scope resource files via the resourcefiles API.

3. Input / output envelope contract

The envelope contract is defined in:

  • `mcp-server/src/apigee_skill/envelope.py` — the runtime

Pydantic models. See its docstrings for per-tool envelope shapes and retry semantics.

Three invariants every host runtime must respect:

  1. `status` is authoritative. Treat status="error" as failure

even if files[] is non-empty (partial outputs are valid).

  1. `files[]` is the only file channel. Do not parse stdout, stderr,

or diagnostics[] for filenames. Write every files[i] entry to the path files[i].path, using files[i].encoding (utf-8 for text, base64 for the packaged ZIP).

  1. `error.retryable` is the only retry signal. A tool that returned

retryable=false MUST NOT be auto-retried by the host. This is the guardrail against revision-sprawl on upload_proxy and against double-deploys on deploy_revision.

3.1 The 13-member closed error.kind set
KindMeaningretryable default
input_invalidValidation rejected the input.false
path_unsafeA files[].path would escape the working tree.false
platform_not_supportedPolicy not available on the declared platform.false
policy_unknownPolicy name not in the catalog.false
resource_unknownResource type not in the v1 supported set.false
bundle_invalidBundle failed structural validation.false
auth_missing_tokenNo bearer token on the request.false
auth_invalid_tokenSignature / exp / iss / aud failed.false
auth_invalid_audienceaud did not match the canonical MCP URI.false
apigee_forbiddenApigee returned 403.false
apigee_not_foundApigee returned 404.false
apigee_conflictApigee returned 409 (e.g., revision already exists).false
apigee_unavailableApigee returned 5xx / network error.varies, `false` for `upload_proxy`

The auth_* family is produced by the bearer-token validator. The apigee_* family is produced by the Apigee client wrapper. path_unsafe is produced by safety/path.py and is the only acceptable response to a path traversal attempt — never silently strip the bad path.


4. Common workflows

These are the canonical multi-tool sequences. Treat each step as a single tool call returning an envelope; check status before continuing.

4.1 Scaffold → add policies → package → upload → deploy

The most common end-to-end flow.

  1. `scaffold_proxy` with {name, basepath, target_url, platform}.
  • Writes proxies/{name}/apiproxy/ skeleton + proxy.config.yaml.
  1. `recommend_config_strategy` for each external dependency the

user mentioned (a secret, a base URL, an environment-specific value). Use the returned strategy when calling add_policy.

  1. `add_policy` for each policy, in flow order (PreFlow first,

then conditional flows, then PostFlow). For resource-bearing policies, prefer scaffold_resource → add_resource → bind_resource_to_policy rather than hand-writing <ResourceURL>.

  1. `validate_bundle` before packaging. If it returns `error.kind=

bundle_invalid`, surface the diagnostics list to the user and stop.

  1. `package_bundle` with {proxy_name}. Returns a single

base64-encoded ZIP entry in files[].

  1. `upload_proxy` with the packaged ZIP. On

error.kind=apigee_unavailable (with retryable=false), STOP and ask the user — auto-retry would create duplicate revisions.

  1. `deploy_revision` with {proxy_name, env, revision}. Polls for

up to 5 minutes; at the ceiling, returns apigee_unavailable retryable=true without cancelling the underlying Apigee deploy.

4.2 Add a resource to an existing bundle
  1. `scaffold_resource` with `{proxy_name, resource_type, scope,

name}`. Emits a starter file at the right subdir.

  1. `add_resource` to register the file in proxy.config.yaml.
  2. `bind_resource_to_policy` if the resource is consumed by a

specific policy (JS, Java callout, OAS validator). The tool verifies Java <ClassName> matches the JAR's declared class.

  1. `validate_resources` to check syntax (node --check for JS,

lint for OAS, well-formedness for XSLT / WSDL / XSD).

  1. `list_resources` at any time to inspect inventory and surface

orphans / dangling references.

4.3 Diff before upload (recommended)

Before package_bundle → upload_proxy, call `diff_against_last_upload` with the prior bundle (host-supplied from the user's repo or last-known-state cache). This lets the host runtime preview the change set to the user before any Apigee write.

4.4 Org / env-scope configuration

Use `provision_config` for TargetServer, KVM, or PropertySet created at the env scope. Use `provision_resources` for resource files that should live at env or org scope (rather than in the bundle itself).

Both tools dry-run unless confirm=true. Always present the dry-run diff to the user before passing confirm=true.


5. Authentication model

The MCP server uses a strict three-party auth model:

  1. Host → MCP server: bearer token with audience equal to the MCP

server's canonical URI. Validated for signature, exp, iss, aud.

  1. MCP server → STS: RFC 8693 Token Exchange against Google STS

using the validated bearer token as the subject_token. Returns a short-lived Apigee-scoped token bound to the user's identity via Workload Identity Federation.

  1. MCP server → Apigee: the exchanged token is used for exactly

one Apigee call, then discarded. No token caching in v1.

The MCP spec 2025-06-18 forbids forwarding the bearer token upstream. The token exchange is what makes per-user audit trails work on the Apigee side without sharing credentials.

If the host is in local mode (APIGEE_PROXY_SKILL_MODE=local, the default), the bearer token issuer allowlist is permissive (https://localhost/* plus the host's local IDP). In remote mode (APIGEE_PROXY_SKILL_MODE=remote, Cloud Run), the issuer allowlist is restricted to the IAP / IAM identity issuer.


This is the start of the file. Read the full SKILL.md on GitHub.

Security

  • Security scanPassed, 100 of 100Pattern checks on the skill's files.
  • Model reviewNot runA model review is scheduled for the next rescan.

Quality evaluation

  • Task evaluationNot runNo evaluation yet. Run one in Skill Studio.

Source

Popularity

Repository stars
220
Repository forks
173
7-day trend score
27

Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.

Works with

Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.

  • Claude Code
  • Cursor
  • GitHub Copilot
  • Windsurf
  • Codex
  • Gemini CLI
  • Cline
  • Amp
  • Roo Code
  • Goose
  • Continue
  • Kilo Code
  • Junie
  • Trae
  • OpenHands
  • Qwen Code
  • AI Agent
  • Tabnine Chat
  • Sourcegraph Cody
  • Amazon Q
  • Firebase Genkit
  • Sweep
  • Devin
  • Phind
  • Mentat
  • Claude Desktop
  • Aider
  • GPT Pilot
  • Plandex
  • bolt.new
  • v0
  • Replit Agent
  • Anse
  • TypingMind
  • BetterChatGPT
  • LibreChat
  • Warp AI
  • Pieces
  • Fig AI
Embed badge
vskill VERIFIED badge
[![vskill VERIFIED](https://verified-skill.com/api/v1/skills/apigee/devrel/apigee-proxy-skill/badge)](https://verified-skill.com/skills/apigee/devrel/apigee-proxy-skill)

Something wrong with this skill or its page? Tell us.