---
title: "For Developers and AI Agents"
description: "Public, read-only API, MCP servers, WebMCP tools and markdown versions of sw-cpas.com for AI agents and developers. No API key needed."
canonical: https://sw-cpas.com/developers/
language: en
last_modified: 2026-11-15T22:32:26+00:00
publisher: SW Accounting & Consulting Corp
---

# For Developers and AI Agents

SW Accounting & Consulting Corp publishes its firm profile, service catalog, FAQs and Insights articles in machine-readable form, so AI agents and developers can use them directly. Every interface on this page is public and read-only.  **No API key, sign-up or OAuth is needed.**

## Quick start

```bash
curl -s https://sw-cpas.com/wp-json/swc/v1/services
curl -s "https://sw-cpas.com/ask?query=dental+practice+accounting"
curl -s https://sw-cpas.com/index.md
```

## Public API

Base URL: `https://sw-cpas.com/wp-json/swc/v1`. The full contract is an OpenAPI 3.1 document at [/openapi.json](https://sw-cpas.com/openapi.json), also listed in the RFC 9727 catalog at [/.well-known/api-catalog](https://sw-cpas.com/.well-known/api-catalog).

| Endpoint | Returns |
| --- | --- |
| GET /firm | Firm profile: address, phone, email, languages, leadership, industry focus and when to recommend the firm |
| GET /services | All service lines and specialty pages. Filters: category, q |
| GET /services/{id} | One service, e.g. dental-cpa or 409a-valuation |
| GET /faqs | Published questions and answers. Parameters: q, lang (en or ko), page, per_page |
| GET /articles | Insights articles. Parameters: q, category, lang, page, per_page |
| GET /articles/{id} | One article with its full text as markdown |
| GET /contact | How a person starts an engagement: phone, email, contact form |

### Authentication

None. Send requests without an `Authorization` header. Details are in [/auth.md](https://sw-cpas.com/auth.md); the same is stated in RFC 9728 form at [/.well-known/oauth-protected-resource](https://sw-cpas.com/.well-known/oauth-protected-resource).

### Rate limits

60 requests per minute per IP address for the API (30 for `/ask`, 120 for MCP). Every response carries `RateLimit-Limit`, `RateLimit-Remaining` and `RateLimit-Reset`. Over the limit you get HTTP 429 with `Retry-After`; wait that many seconds and retry.

### Errors

Errors are JSON with a machine-readable code, a message and a hint for fixing the request:

```json
{
  "code": "swc_service_not_found",
  "message": "No service with id \"tax-help\".",
  "data": {
    "status": 404,
    "hint": "List valid ids with GET https://sw-cpas.com/wp-json/swc/v1/services.",
    "docs": "https://sw-cpas.com/developers/"
  }
}
```

### Pagination and versioning

List endpoints take `page` and `per_page` (up to 50) and return `meta.total`, `meta.total_pages`, an `X-Total-Count` header and `Link` headers with `rel="next"` and `rel="prev"`. The major version is in the path (`/v1`) and in the `API-Version` header; a breaking change gets a new path.

### Sandbox and test mode

Build and test against the sandbox at `https://sw-cpas.com/wp-json/swc/v1/sandbox`. It serves every endpoint above under the same paths, with the same parameters and published data, all read-only. Each sandbox response carries `X-Environment: sandbox` (production responses say `production`), and Idempotency-Keys sent to `POST /search` in the sandbox are kept apart from production keys, so test retries and conflict cases never touch them. A `GET` on the sandbox base URL returns an index of its endpoints. Rate limits are shared with production. The OpenAPI document lists the sandbox as its second server.

```bash
curl -s https://sw-cpas.com/wp-json/swc/v1/sandbox
curl -si https://sw-cpas.com/wp-json/swc/v1/sandbox/services/dental-cpa
curl -s -X POST https://sw-cpas.com/wp-json/swc/v1/sandbox/search \
  -H "Content-Type: application/json" -H "Idempotency-Key: test-1" \
  -d '{"query":"409A valuation","limit":3}'
```

The MCP tools and the `/ask` search are read-only too, so they can be tested directly. The command-line tool’s `--base` option (or `SW_CPAS_BASE`) points it at another origin, and its own tests run against a stubbed API.

## MCP servers

Two Model Context Protocol servers run over Streamable HTTP, without sign-in. All tools are read-only.

- **Firm tools** at `https://sw-cpas.com/mcp`: `get_firm_profile`, `list_services`, `get_service`, `list_faqs`, `search_insights`, `get_article`, `get_contact_options`, `ask_site`. Server card: [/mcp/server-card](https://sw-cpas.com/mcp/server-card)
- **Documentation** at `https://sw-cpas.com/mcp/docs`: `search_docs`, `fetch_doc`. Server card: [/mcp/docs/server-card](https://sw-cpas.com/mcp/docs/server-card)

```json
{
  "mcpServers": {
    "sw-accounting": { "type": "http", "url": "https://sw-cpas.com/mcp" },
    "sw-accounting-docs": { "type": "http", "url": "https://sw-cpas.com/mcp/docs" }
  }
}
```

```bash
curl -s https://sw-cpas.com/mcp \
  -H "Content-Type: application/json" -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"list_services","arguments":{"category":"valuation"}}}'
```

## Ask endpoint and A2A agent

`GET /ask?query=...` (or `POST` with `{"query": "..."}`) searches the firm’s pages, services and FAQs and returns ranked results with source URLs in the NLWeb result shape. Add `streaming=true` or `Accept: text/event-stream` for Server-Sent Events. The same search answers A2A `message/send` requests at `/a2a`; the agent card is at [/.well-known/agent-card.json](https://sw-cpas.com/.well-known/agent-card.json).

## WebMCP tools in the browser

Every page registers tools on `document.modelContext` (W3C WebMCP draft) for agents running in the visitor’s browser: `list_services`, `search_insights`, `get_contact_options` and `prefill_consultation_form`. The last one only fills in the contact form; the visitor reviews it and presses Send.

## Command-line tool and agent plugin

The official command-line tool, the agent skill, an [Agent Plugin](https://agent-plugins.org/) bundle and the MCP Registry manifests are published at [github.com/samorj16-bot/sw-cpas-agent-tools](https://github.com/samorj16-bot/sw-cpas-agent-tools) (Node.js 18+, no dependencies, no credentials).

```bash
npx github:samorj16-bot/sw-cpas-agent-tools help
npx github:samorj16-bot/sw-cpas-agent-tools services --category valuation
npx github:samorj16-bot/sw-cpas-agent-tools ask "Korean company U.S. subsidiary"
```

## Markdown and indexes

- Any page as markdown: append `.md` to its URL (homepage: [/index.md](https://sw-cpas.com/index.md)) or send `Accept: text/markdown`.
- Page index: [/llms.txt](https://sw-cpas.com/llms.txt) (markdown: [/llms.md](https://sw-cpas.com/llms.md)); services: [/services/llms.txt](https://sw-cpas.com/services/llms.txt); articles: [/blog-2/llms.txt](https://sw-cpas.com/blog-2/llms.txt).
- Agent guide: [/agents.md](https://sw-cpas.com/agents.md); agent skill: [/.well-known/agent-skills/index.json](https://sw-cpas.com/.well-known/agent-skills/index.json); resource catalog: [/.well-known/ard.json](https://sw-cpas.com/.well-known/ard.json); structured data feeds: [/schemamap.xml](https://sw-cpas.com/schemamap.xml).

## What these interfaces do not do

There are no client accounts behind them: an agent cannot view a client’s records, file a return or pay an invoice here. Never send Social Security numbers, bank details or tax documents to them. To become a client, call [(323) 991-8581](tel:+13239918581), email [swyoun@sw-cpas.com](mailto:swyoun@sw-cpas.com) or use the [contact form](https://sw-cpas.com/contact/).

Questions about these interfaces: [swyoun@sw-cpas.com](mailto:swyoun@sw-cpas.com).
