providers/claude/plugin/skills/apideck-mcp-month-end-close/SKILL.md
Task playbook for fetching a month-end financial snapshot via the Apideck MCP server's `apideck-month-end-close-check` workflow tool. Use when the user asks for a P&L, balance sheet, aged creditors, or aged debtors view at a point in time. Read-only, idempotent, returns partial snapshots when some reports aren't supported by the connector.
npx skillsauth add apideck-libraries/api-skills apideck-mcp-month-end-closeInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
When the user wants a one-shot financial snapshot, prefer apideck-month-end-close-check over fetching the four reports individually. The workflow fans out aged creditors, aged debtors, balance sheet, and profit-and-loss in parallel against the connected accounting service and returns one aggregated object.
| User intent | Tool |
|---|---|
| "Run the month-end close", "P&L plus balance sheet for last month", "Aged AP/AR snapshot as of March 31" | apideck-month-end-close-check ✓ |
| "Just the P&L" | accounting-profit-and-loss-get directly |
| "Just aged creditors" | accounting-aged-creditors-get directly |
| "Reconcile bank statements" | Out of scope — use the connector's native reconciliation |
report_as_of_date to use today. Most users running a month-end ask for "last month", in which case pass an explicit YYYY-MM-DD like "2026-03-31".{ unsupported: true, reason } for steps the connector can't fulfill, plus a top-level warnings[] array. Surface these to the user instead of treating them as failures.isError: true only fires when every report failed — typically a missing connection or expired credentials. Partial snapshots come back as isError: false so the agent can still extract value.| Arg | Required | Default | Notes |
|---|---|---|---|
| report_as_of_date | no | today (YYYY-MM-DD) | Cutoff date for aged reports + balance sheet. |
| x-apideck-service-id | no | first accounting connection | E.g. "xero", "quickbooks". |
{
"report_as_of_date": "2026-03-31",
"service_id": "xero",
"aged_creditors": { "summary": [...] },
"aged_debtors": { "summary": [...] },
"balance_sheet": { "assets": 100000, ... },
"profit_and_loss":{ "revenue": 250000, ... }
}
{
"report_as_of_date": "2026-03-31",
"service_id": "odoo",
"aged_creditors": { "unsupported": true, "reason": "Aged-creditors not implemented for Odoo" },
"aged_debtors": { "unsupported": true, "reason": "..." },
"balance_sheet": { "assets": 100000, ... },
"profit_and_loss":{ "revenue": 250000, ... },
"warnings": [
"aged_creditors: unsupported on odoo (...)",
"aged_debtors: unsupported on odoo (...)"
]
}
isError: false — two reports came back, that's still useful.
{
"report_as_of_date": "2026-03-31",
"service_id": null,
"aged_creditors": { "error": "..." },
"aged_debtors": { "error": "..." },
"balance_sheet": { "error": "..." },
"profit_and_loss":{ "error": "..." },
"warnings": [...]
}
With isError: true. Usually a missing connection — surface the elicitation URL.
User: "Give me a month-end snapshot for March 2026 from QuickBooks."
{
"name": "apideck-month-end-close-check",
"arguments": {
"report_as_of_date": "2026-03-31",
"x-apideck-service-id": "quickbooks"
}
}
Then summarize for the user, calling out any unsupported rows distinctly:
On 2026-03-31 in QuickBooks: revenue $250K, total assets $100K. Aged creditors / aged debtors aren't supported by this connector — pull those from the Bills-list and Invoices-list reports if you need them.
| Symptom | Cause | Fix |
|---|---|---|
| All four reports unsupported | Connector doesn't implement these (e.g. Odoo without the Reports module) | Surface the limitation; suggest aggregating from accounting-bills-list + accounting-invoices-list instead |
| UnsupportedFiltersError on a report | Connector rejects filter[report_as_of_date] or filter[end_date] | Connector quirk — currently surfaces as unsupported with the upstream message |
| UrlElicitationRequiredError | Connection expired/missing | Surface consent URL, retry |
apideck-mcp — front-door skilldevelopment
Jira Teams via Apideck's Proxy API + managed Vault auth — Apideck handles auth and proxies HTTP calls to Jira Teams's native API. Use when the user wants to call Jira Teams (no unified API resource mapping). Routes through Apideck with serviceId "jira-teams".
development
Jira Service Desk via Apideck's Proxy API + managed Vault auth — Apideck handles auth and proxies HTTP calls to Jira Service Desk's native API. Use when the user wants to call Jira Service Desk (no unified API resource mapping). Routes through Apideck with serviceId "jira-service-desk".
development
Jira Data Center via Apideck's Proxy API + managed Vault auth — Apideck handles auth and proxies HTTP calls to Jira Data Center's native API. Use when the user wants to call Jira Data Center (no unified API resource mapping). Routes through Apideck with serviceId "jira-data-center".
development
JetBrains YouTrack via Apideck's Proxy API + managed Vault auth — Apideck handles auth and proxies HTTP calls to JetBrains YouTrack's native API. Use when the user wants to call JetBrains YouTrack (no unified API resource mapping). Routes through Apideck with serviceId "jetbrains-youtrack".