diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml new file mode 100644 index 0000000..a9f6e5f --- /dev/null +++ b/.gitea/workflows/build.yml @@ -0,0 +1,37 @@ +name: build +on: + push: + branches: [main] + +jobs: + test: + runs-on: ubuntu-latest + steps: + - name: checkout from in-cluster gitea + run: | + set -e + git clone --depth=1 \ + "http://gitea_admin:${{ secrets.ADMIN_PW }}@gitea-http.gitea.svc.cluster.local:3000/gitea_admin/a2a-mcp.git" . + git checkout "$GITHUB_SHA" + + - name: setup node + run: | + set -e + apt-get update + apt-get install -y --no-install-recommends ca-certificates curl + curl -fsSL https://deb.nodesource.com/setup_20.x | bash - + apt-get install -y --no-install-recommends nodejs + node --version + npm --version + + - name: install dependencies + run: npm ci + + - name: test + run: npm test + + - name: build + run: npm run build + + - name: verify package contents + run: npm pack --dry-run diff --git a/.gitea/workflows/publish.yml b/.gitea/workflows/publish.yml new file mode 100644 index 0000000..d91d3e0 --- /dev/null +++ b/.gitea/workflows/publish.yml @@ -0,0 +1,57 @@ +name: publish +on: + push: + tags: ["v*"] + +jobs: + npm: + runs-on: ubuntu-latest + steps: + - name: checkout from in-cluster gitea + run: | + set -e + git clone --depth=1 --branch "${GITHUB_REF_NAME}" \ + "http://gitea_admin:${{ secrets.ADMIN_PW }}@gitea-http.gitea.svc.cluster.local:3000/gitea_admin/a2a-mcp.git" . + git log -1 --oneline + + - name: setup node + run: | + set -e + apt-get update + apt-get install -y --no-install-recommends ca-certificates curl + curl -fsSL https://deb.nodesource.com/setup_20.x | bash - + apt-get install -y --no-install-recommends nodejs + node --version + npm --version + + - name: install dependencies + run: npm ci + + - name: assert tag matches package version + run: | + PKG_VER=$(node -p "require('./package.json').version") + TAG_VER="${GITHUB_REF_NAME#v}" + echo "tag=$TAG_VER package=$PKG_VER" + if [ "$TAG_VER" != "$PKG_VER" ]; then + echo "tag $TAG_VER does not match package.json version $PKG_VER" >&2 + exit 1 + fi + + - name: test + run: npm test + + - name: build + run: npm run build + + - name: verify package contents + run: npm pack --dry-run + + - name: publish to npm + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + run: | + if [ -z "$NODE_AUTH_TOKEN" ]; then + echo "NPM_TOKEN not set on this repo." >&2 + exit 1 + fi + npm publish --access public diff --git a/README.md b/README.md new file mode 100644 index 0000000..30ee291 --- /dev/null +++ b/README.md @@ -0,0 +1,43 @@ +# @a2a/mcp + +MCP gateway for a2acloud agents. It runs locally as a stdio MCP server and +exposes deployed A2A agents as tools to Claude Code, Cursor, and other MCP +clients. + +## Quickstart + +```bash +npx -y @a2a/mcp login +npx -y @a2a/mcp add +npx -y @a2a/mcp doctor +``` + +Add it to your MCP client config: + +```json +{ + "mcpServers": { + "a2a": { + "command": "npx", + "args": ["-y", "@a2a/mcp"] + } + } +} +``` + +Restart the client after adding or removing agents. + +## Commands + +```bash +a2a-mcp login # save control-plane credentials +a2a-mcp whoami # show current account +a2a-mcp agents # list agents visible to your account +a2a-mcp add # expose one agent through this gateway +a2a-mcp list # list locally enabled agents +a2a-mcp remove # stop exposing an agent +a2a-mcp doctor # probe enabled agents and count tools +a2a-mcp logout # clear local credentials +``` + +Running `a2a-mcp` with no command starts the MCP gateway over stdio.