Developers & AI agents
A public, read-only, unauthenticated JSON API over the MSP Navigator software catalog — published products, active vendors, and the category tree. No API key, no signup.
What this is
Every product and vendor page on MSP Navigator is already public — this API just exposes the same catalog data as structured JSON instead of HTML, so developers and AI agents can query it directly instead of scraping pages. All endpoints are GET, return Content-Type: application/json, and work without any authentication, API key, or cookie.
Fair use: this runs on a small catalog app, not a high-throughput API tier. Please cache responses client-side and avoid high-frequency polling. There is no published rate limit today, but abusive traffic may be throttled or blocked.
Endpoints
/api/v1API index: name, version, docs, and a list of endpoints.
curl https://www.msp-navigator.com/api/v1/api/v1/productsList & search published products. Filters: q, category, vendor, hasAi, hasMcp, hasCli, hasApi, psa. Sort: name | updated | featured.
curl "https://www.msp-navigator.com/api/v1/products?hasMcp=true&limit=10"/api/v1/products/{slug}Full product detail: description, pricing tiers, features, PSA integrations, AI/automation capabilities, vendor.
curl https://www.msp-navigator.com/api/v1/products/connectwise-psa/api/v1/vendorsList active vendors with published product counts. Supports q, sort, page, limit.
curl "https://www.msp-navigator.com/api/v1/vendors?sort=products"/api/v1/vendors/{slug}Full vendor detail: profile, products, recent news.
curl https://www.msp-navigator.com/api/v1/vendors/connectwise/api/v1/categoriesThe active category tree (top-level categories with their children) and product counts.
curl https://www.msp-navigator.com/api/v1/categories/api/v1/categories/{slug}One category, its children, and a first page of its published products.
curl https://www.msp-navigator.com/api/v1/categories/security/api/v1/search?q=Unified search across products (top 10), vendors (top 5), and categories (top 5). q must be 2+ characters.
curl "https://www.msp-navigator.com/api/v1/search?q=backup"Error format
Every non-2xx response — including a request to an unknown path under /api/v1 — returns the same JSON shape, so you can parse errors programmatically instead of branching on status text:
{
"error": {
"code": "not_found",
"message": "No published product found with slug \"foo\".",
"hint": "Check /api/v1/products for valid slugs, or GET /api/v1/search?q= to find one.",
"docs": "https://www.msp-navigator.com/developers"
}
}code is one of bad_request (400), not_found (404), or internal_error (500).
Pagination
List endpoints (/api/v1/products, /api/v1/vendors) accept page (1-based, default 1) and limit (default 25, max 100), and return:
{
"data": [ /* ... */ ],
"meta": { "page": 1, "limit": 25, "total": 412, "totalPages": 17 },
"links": {
"self": "https://www.msp-navigator.com/api/v1/products?page=1&limit=25",
"next": "https://www.msp-navigator.com/api/v1/products?page=2&limit=25"
}
}Authenticated access for your own AI agent
Beyond the public catalog above, a signed-in user can create a personal API token and let their own AI agent act on their behalf: read their profile, edit their MSP company profile, manage their company's shared product stack (the same stack every user on their team reads and writes), or — for a claimed vendor — edit their own products.
1. Create a token
Sign in, go to Settings → Connected agents, and create a token with the scopes your agent needs. The raw token (mspn_…) is shown exactly once — copy it immediately, since only its hash is stored afterward.
2. Scopes
| Scope | Grants |
|---|---|
read | Read your profile, company and stack |
write:profile | Update your user and company profile |
write:stack | Add, update and remove products in your company stack |
write:vendor | Edit products of the vendor you have claimed |
Any write:* scope implies read.
3. Call the API
curl https://www.msp-navigator.com/api/v1/me \
-H "Authorization: Bearer mspn_your_token_here"Authenticated endpoints
/api/v1/mereadYour own user, MSP company summary, claimed vendor (if any), and token info.
/api/v1/me/companyreadYour editable MSP company profile.
/api/v1/me/companywrite:profilePartially update your MSP company profile (description, website, headquarters, verticals/regions/languages/certifications, social links). name/slug/domain are read-only.
/api/v1/me/stackreadYour MSP company's shared product stack (status/notes/isPrimary and counts by status) — the same stack every user in your company reads and writes, not a personal list. 404 if you're not linked to a company.
/api/v1/me/stack/{productSlug}write:stackIdempotently add or update one product in your company's stack ({ status, notes?, isPrimary? }).
/api/v1/me/stack/{productSlug}write:stackIdempotently remove one product from your company's stack. Always 204.
/api/v1/vendor/productsreadEvery product of the vendor page you've claimed, including DRAFT/ARCHIVED ones.
/api/v1/vendor/products/{slug}write:vendorEdit one of your vendor's products: tagline, description, links, pricing, PSA integrations, AI/automation capability flags. name/slug/status/isFeatured are read-only.
Errors & rate limit
These endpoints use the same { error: { code, message, hint, docs } } envelope as the rest of the API, with a few additional codes:
{
"error": {
"code": "forbidden",
"message": "This endpoint requires the \"write:vendor\" scope.",
"hint": "Create a token with the \"write:vendor\" scope under Settings → Connected agents.",
"docs": "https://www.msp-navigator.com/developers"
}
}code is one of unauthorized (401 — missing, invalid, expired, or revoked token), forbidden (403 — wrong scope, or you don't own the resource you're editing), validation_error (400 — with a details: [{ path, message }] array), not_found (404), or rate_limited (429 — with a Retry-After header).
Rate limit: 120 requests/minute per token. Every response from these endpoints — reads and writes — is sent with Cache-Control: no-store, since it reflects one caller's own account. Send an Idempotency-Key header and it's echoed back on the response.
Connect your agent
ChatGPT (custom GPT Actions)
Import https://www.msp-navigator.com/openapi.json as the Action's schema. Under Authentication, choose API Key, then set Auth Type to Bearer and paste the token.
Claude, or any agent with HTTP/OpenAPI tools
Load the same OpenAPI document as the tool definitions — every authenticated operation carries an x-required-scope extension saying which scope it needs — and send the token on every call as Authorization: Bearer mspn_….
Prefer native MCP tools over HTTP/OpenAPI? See the MCP server section below — same scopes, same token.
MCP server
A remote MCP (Model Context Protocol) server over Streamable HTTP, at the same catalog and personal-API-token data this page documents — for agents that speak MCP natively instead of HTTP/OpenAPI.
https://www.msp-navigator.com/mcpPublic tools (no token required)
| Tool | What it does |
|---|---|
search_products | Search & filter published products (q, category, vendor, hasAi/hasMcp/hasCli/hasApi, psa, sort, page, limit). |
get_product | Full product detail by slug. |
list_vendors | List active vendors (q, sort, page, limit). |
get_vendor | Full vendor detail by slug: profile, products, recent news. |
list_categories | The active category tree with product counts. |
get_category | One category, its children, and a page of its products. |
search | Unified search across products, vendors, and categories. |
get_news | Recent MSP-relevant vendor announcements, optionally scoped to one vendor. |
Account tools (personal API token required)
Same scopes as the REST API above. Call without a token (or without the required scope) and the tool returns a guided error explaining how to create one — it doesn't fail the whole connection.
| Tool | Scope | What it does |
|---|---|---|
get_my_profile | read | Your user, MSP company summary, claimed vendor, and token info. |
get_my_company | read | Your editable MSP company profile. |
update_my_company | write:profile | Partially update your MSP company profile. |
get_my_stack | read | Your MSP company's shared product stack. |
set_stack_item | write:stack | Idempotently add or update one product in your company's stack. |
remove_stack_item | write:stack | Idempotently remove one product from your company's stack. |
list_my_vendor_products | read | Every product of the vendor page you've claimed. |
update_my_vendor_product | write:vendor | Edit one of your claimed vendor's products. |
Connect a client
Claude Code
claude mcp add --transport http msp-navigator https://www.msp-navigator.com/mcp \
--header "Authorization: Bearer <token>"Claude Desktop / claude.ai (custom connector)
Add https://www.msp-navigator.com/mcp as a custom connector URL. The public catalog tools work with no token at all; for account tools, supply the Authorization: Bearer <token> header where your client supports a custom header per connector.
Cursor (.cursor/mcp.json)
{
"mcpServers": {
"msp-navigator": {
"url": "https://www.msp-navigator.com/mcp",
"headers": { "Authorization": "Bearer <token>" }
}
}
}Any other MCP client
Point it at https://www.msp-navigator.com/mcp over Streamable HTTP. If it supports per-server custom headers, set Authorization: Bearer <token> to use the account tools; without one, the public catalog tools still work.
Machine-readable resources
- /openapi.json — OpenAPI 3.1 specification for this entire API (also served at
/api/v1/openapi.json), with a uniqueoperationIdand a description written for LLM tool-calling on every endpoint. - /llms.txt — a plain-text summary of the site for LLMs.
- Any public page on this site can also be fetched as clean Markdown by sending
Accept: text/markdowninstead of the default HTML — useful for feeding a product or vendor page straight into an LLM context window without extra parsing.
Using this with AI agents
Import /openapi.json directly as a tool/function definition source — most agent frameworks (OpenAI function calling, Claude tool use, LangChain, etc.) can load an OpenAPI 3.1 document and generate callable tools from it automatically. Every operation has a stable, unique operationId (e.g. listProducts, getProduct, search) you can use as the tool name.
Prefer native MCP tools? A remote MCP server at /mcp exposes the same catalog and personal-API-token data as callable tools over Streamable HTTP.
Questions, bugs, or a use case this API doesn't support yet? Contact us.