For developers
Protocol-level details for anyone building an MCP client or connector integration against Packstack.
Endpoints
| Purpose | URL |
|---|---|
| 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 |
| Authorize | https://api.packstack.io/oauth/authorize |
| Token | https://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
/mcpreturns401withWWW-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 asclient_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
S256is required;plainis rejected. resourceis 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);stateis echoed unchanged. - The token endpoint takes
application/x-www-form-urlencodedand returns RFC 6749 error codes (invalid_grant,invalid_client,invalid_scope,invalid_target,unsupported_grant_type).
Scopes
| Scope | Grants |
|---|---|
packstack:read | All read tools and prompts. Free for every account. |
packstack:write | All write tools. Implies read. Calls additionally require the user to have an active subscription; otherwise the tool returns an isError result explaining that. |
offline_access | A 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/tokenand/oauth/revoke, 10/min to/oauth/register.429withRetry-Afterwhen 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:writescope. 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.