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

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, also listed in the RFC 9727 catalog at /.well-known/api-catalog.

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

Authentication

None. Send requests without an Authorization header. Details are in /auth.md; the same is stated in RFC 9728 form at /.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:

{
  "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.

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
  • Documentation at https://sw-cpas.com/mcp/docs: search_docs, fetch_doc. Server card: /mcp/docs/server-card
{
  "mcpServers": {
    "sw-accounting": { "type": "http", "url": "https://sw-cpas.com/mcp" },
    "sw-accounting-docs": { "type": "http", "url": "https://sw-cpas.com/mcp/docs" }
  }
}
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.

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 bundle and the MCP Registry manifests are published at github.com/samorj16-bot/sw-cpas-agent-tools (Node.js 18+, no dependencies, no credentials).

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

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, email swyoun@sw-cpas.com or use the contact form.

Questions about these interfaces: swyoun@sw-cpas.com.