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.mdPublic 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.
| 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; 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
- Any page as markdown: append
.mdto its URL (homepage: /index.md) or sendAccept: text/markdown. - Page index: /llms.txt (markdown: /llms.md); services: /services/llms.txt; articles: /blog-2/llms.txt.
- Agent guide: /agents.md; agent skill: /.well-known/agent-skills/index.json; resource catalog: /.well-known/ard.json; structured data feeds: /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, email swyoun@sw-cpas.com or use the contact form.
Questions about these interfaces: swyoun@sw-cpas.com.
