Remote MCP Servers (Atlassian, Slack, Linear)
The Agent Receipts proxy expects an upstream MCP server it can spawn as a local stdio process. A growing class of MCP servers — Atlassian, Slack, Linear, HubSpot, Notion, and others — are hosted as remote HTTP/SSE endpoints behind OAuth instead. To audit those today, compose mcp-remote in front of mcp-proxy: mcp-remote handles the OAuth dance and exposes a stdio MCP transport, which the proxy then wraps as it would any local server.
How the composition works
Section titled “How the composition works”MCP Client (Claude / Codex) │ stdio ▼ mcp-proxy ◄── audits, scores, signs receipts │ stdio ▼ mcp-remote ◄── OAuth flow, token refresh, transport bridge │ HTTP/SSE + Bearer token ▼Remote MCP Server (e.g. mcp.atlassian.com/v1/mcp)mcp-remote is responsible for the OAuth flow and token refresh. The proxy never sees the bearer token, which is good for redaction (one less secret to leak into the audit log), but means receipts cannot tie an action to a specific token identity. If you need that, follow #227.
Prerequisites
Section titled “Prerequisites”- mcp-proxy installed
- A signing key pair generated (see below)
- Node.js (for
npx mcp-remote) - A remote MCP endpoint and an account that can authorise it. The example below uses Atlassian’s Remote MCP Server at
https://mcp.atlassian.com/v1/mcp.
Generate a signing key
Section titled “Generate a signing key”mcp-proxy init --name atlassian-proxy# creates ~/.agent-receipts/atlassian-proxy.pem (0600) and ~/.agent-receipts/atlassian-proxy.pem.pubWorked example: Atlassian (Jira + Confluence)
Section titled “Worked example: Atlassian (Jira + Confluence)”Add an entry to your MCP client config that runs mcp-proxy wrapping npx mcp-remote <url>. For Claude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json on macOS):
{ "mcpServers": { "atlassian-audited": { "command": "/Users/YOU/go/bin/mcp-proxy", "args": [ "-name", "atlassian", "-key", "/Users/YOU/.agent-receipts/atlassian-proxy.pem", "-issuer-name", "Claude Desktop", "-operator-id", "did:web:anthropic.com", "-operator-name", "Anthropic", "npx", "--registry", "https://registry.npmjs.org", "-y", "mcp-remote", "https://mcp.atlassian.com/v1/mcp" ] } }}For Claude Code:
claude mcp add-json atlassian-audited --scope user '{ "command": "/Users/YOU/go/bin/mcp-proxy", "args": [ "-name", "atlassian", "-key", "'"$HOME"'/.agent-receipts/atlassian-proxy.pem", "-issuer-name", "Claude Code", "-operator-id", "did:web:anthropic.com", "-operator-name", "Anthropic", "npx", "--registry", "https://registry.npmjs.org", "-y", "mcp-remote", "https://mcp.atlassian.com/v1/mcp" ]}'The first time the server is invoked, mcp-remote opens a browser tab to complete the OAuth flow with Atlassian. Subsequent runs reuse the cached token (managed by mcp-remote, not the proxy).
Bundled taxonomy
Section titled “Bundled taxonomy”The proxy ships with bundled mappings for Atlassian’s Jira and Confluence tools (createJiraIssue, editJiraIssue, searchJiraIssuesUsingJql, createConfluencePage, updateConfluencePage, and others), so writes are scored as data.api.write and reads as data.api.read out of the box. No -taxonomy flag is required for those names. To extend or override, supply your own JSON file via -taxonomy /path/to/file.json — user mappings win on conflict. To disable the bundled set entirely, pass -bundled-taxonomies=false.
The list of bundled taxonomies lives at mcp-proxy/configs/ — open a PR to add or correct mappings.
Caveats
Section titled “Caveats”- OAuth is invisible to the proxy.
mcp-remoteowns the credential. The proxy can’t include token identity in receipts and can’t log auth refreshes. Tracked in #227. - Naming collision. There are several unrelated tools called
mcp-proxyin the ecosystem — make sure yourcommandpath points at the Agent Receipts binary (the one you installed viago installor downloaded from this project).
- Corporate npm registry. If your npm is configured to use a private registry (e.g. AWS CodeArtifact),
npx mcp-remotewill fail with a404 Not Founderror that looks like a missing package. The fix — already in the examples above — is to pass--registry https://registry.npmjs.orgexplicitly tonpx.