For developers

Protocol-level details for anyone building an MCP client or connector integration against Packstack.

Endpoints

PurposeURL
MCP server (Streamable HTTP)https://api.packstack.io/mcp
Protected resource metadata (RFC 9728)https://api.packstack.io/.well-known/oauth-protected-resource/mcp
Authorization server metadata (RFC 8414)https://api.packstack.io/.well-known/oauth-authorization-server
Authorizehttps://api.packstack.io/oauth/authorize
Tokenhttps://api.packstack.io/oauth/token
Revoke (RFC 7009)https://api.packstack.io/oauth/revoke
Dynamic client registration (RFC 7591)https://api.packstack.io/oauth/register

The issuer is https://api.packstack.io. The canonical resource identifier — what you pass as resource (RFC 8707) and what every token is bound to — is exactly:

resource

Transport

Streamable HTTP per the MCP specification (2025-11-25 and later). The server is stateless: each JSON-RPC request is one HTTP POST and returns JSON (Accept: application/json, text/event-stream is accepted; responses are JSON). There is no SSE-only legacy endpoint. Every request needs Authorization: Bearer <access_token>; tokens in the query string are rejected.

Authorization

OAuth 2.1 authorization-code flow with PKCE. Concretely:

  • An unauthenticated request to /mcp returns 401 with WWW-Authenticate: Bearer resource_metadata="…", scope="packstack:read packstack:write".
  • Client registration: Client ID Metadata Documents are preferred (client_id_metadata_document_supported: true) — use your HTTPS metadata URL as client_id. Dynamic registration is available as a fallback. Only public clients (token_endpoint_auth_method: none) are issued tokens; ask us about pre-registered confidential clients.
  • PKCE with S256 is required; plain is rejected.
  • resource is required on both the authorization and token requests and must equal the canonical resource above.
  • Redirect URIs must match a registered value exactly; loopback URIs (http://127.0.0.1/…, http://localhost/…) match with the port ignored, per RFC 8252.
  • Authorization responses include iss (RFC 9207); state is echoed unchanged.
  • The token endpoint takes application/x-www-form-urlencoded and returns RFC 6749 error codes (invalid_grant, invalid_client, invalid_scope, invalid_target, unsupported_grant_type).

Scopes

ScopeGrants
packstack:readAll read tools and prompts. Free for every account.
packstack:writeAll write tools. Implies read. Calls additionally require the user to have an active subscription; otherwise the tool returns an isError result explaining that.
offline_accessA refresh token is issued.

Request both packstack:read and packstack:write up front. Calling a write tool with a read-only token returns HTTP 403 with WWW-Authenticate: Bearer error="insufficient_scope", scope="packstack:read packstack:write"; clients that implement step-up can act on it, but most hosted assistants don't, and users then have to reconnect.

Tokens

Access tokens are opaque and live one hour. Refresh tokens rotate on every use and expire after 30 days idle or one year absolute; presenting a rotated-out refresh token revokes the whole token family. Refresh may narrow scope, never widen it. Users can revoke a client's grant at any time from Settings → Connected apps; the next request gets 401.

Tools

Ten read tools (get_me, list_trips, get_trip, search_gear, get_item, list_categories, list_kits, get_kit, search_catalog, list_hiker_profiles) and sixteen write tools covering trips, packs, gear, kits and gear lifecycle. Every tool carries MCP annotations (readOnlyHint, destructiveHint: false throughout — there are no delete tools) and returns structuredContent alongside text. Weights always include grams and a display string in the user's unit; trip distances and temperatures likewise carry both systems. Call tools/list for the live schemas; descriptions are written for the model and are the source of truth.

Three prompts are exposed via prompts/list: shakedown, plan_pack, lighten, each taking a trip argument.

Limits

  • Per IP: 30 requests/min to /oauth/authorize, 20/min to /oauth/token and /oauth/revoke, 10/min to /oauth/register. 429 with Retry-After when exceeded.
  • Tool results cap lists at 500 gear items and 100 catalog products per call.
  • The catalog search tool is read-only and public data; everything else is scoped to the authorizing user.

Changelog

  • 2026-09-17 — Write tools (16) and the packstack:write scope. Both scopes now requested at first connection.
  • 2026-09-17 — Initial release: OAuth 2.1 authorization server, read tools (10), prompts (3).

Contact

Integration questions, pre-registered client requests, and security reports: support@packstack.io.