poweroffice-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@poweroffice-mcpsearch for customers with 'Acme' in their name"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
PowerOffice MCP for Codex
A local MCP server for secure access from Codex to the PowerOffice Go API v2 with read-only and explicitly confirmed write operations. The server works with the DEMO API, uses OAuth 2.0 Client Credentials, and provides small, explicitly limited tools instead of a generic HTTP proxy.
What is already available
poweroffice_configuration_status— checks whether configuration exists without exposing key values.poweroffice_connection_info— checks the connection and returns available integrations/privileges.poweroffice_search_customers— searches customers with filters and pagination.poweroffice_get_customer— gets a single customer by numeric ID.poweroffice_list_general_ledger_accounts— reads the chart of accounts.poweroffice_list_account_transactions— reads transactions for a required date range.poweroffice_create_customer— creates a customer afterconfirm=true.poweroffice_update_customer— applies an allowed JSON Patch to a customer afterconfirm=true.poweroffice_create_general_ledger_account— creates an account afterconfirm=true.poweroffice_update_general_ledger_account— applies an allowed JSON Patch to an account afterconfirm=true.
Read tools remain read-only. Write tools modify data only with an explicit confirm=true; deleting, posting, and sending documents are not part of this stage.
Related MCP server: vklass-mcp
Requirements
Node.js 22 or newer
pnpm 11
PowerOffice application key, client key, and subscription key
the access roles needed for the endpoints being called
Installation
pnpm install
cp .env.example .env.local
pnpm build
pnpm testFill in .env.local locally:
PO_ENV=demo
PO_APPLICATION_KEY=...
PO_CLIENT_KEY=...
PO_SUBSCRIPTION_KEY=...
PO_USER_AGENT=poweroffice-mcp/0.1 your-email@example.com.env.local is excluded from Git. Do not send keys in chat and do not add them to .codex/config.toml.
Connecting to Codex
The project file .codex/config.toml already launches the built dist/index.js via STDIO. It reads .env.local if the file exists, and can also receive the listed variables from the Codex process environment.
After pnpm build, restart the Codex task for this project. Start by calling poweroffice_configuration_status, then poweroffice_connection_info.
Local development
pnpm dev
pnpm typecheck
pnpm test
pnpm build
pnpm smokeThe server writes only MCP messages to stdout; startup errors go to stderr. Tokens are cached with a margin before expiration; on 401 one token refresh is performed, and on 429 up to two retries with a delay of at least one second for read requests. Write requests are not retried automatically to avoid duplicates. The overall request rate is limited by the PO_MAX_REQUESTS_PER_SECOND value and cannot exceed 10.
Environment variables
Variable | Required | Default value |
| no |
|
| yes | — |
| yes | — |
| yes | — |
| no |
|
| no |
|
| no |
|
For production, switch PO_ENV=production; the token and API URLs are selected by code, not entered by the user.
MVP boundaries
Only the PowerOffice API v2 and the STDIO transport.
No webhooks, automatic paging through all pages, or operations for deleting, posting, and sending documents.
Write tools are limited to Customers and GeneralLedgerAccounts and require
confirm=true.The
Fieldsfield can be overridden, but by default the server requests compact data sets.The next page is always requested explicitly via
pageNumber; theX-Paginationheader metadata is returned together with the result.
Documentation: PowerOffice Developer Portal, MCP in Codex.
Available Tools
10 toolspoweroffice_configuration_statusPowerOffice configuration statusARead-onlyIdempotent
Check whether the PowerOffice MCP process has the required environment variables. Does not reveal credential values and does not call PowerOffice.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| configured | Yes | |
| environment | Yes | |
| missingVariables | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavioral context beyond annotations: it explicitly promises not to reveal credential values and not to call PowerOffice. This is important trust and safety information that annotations alone do not convey, fully aligning with the readOnly, idempotent, and non-destructive hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no filler: the first states the primary purpose, and the second adds two important behavioral exclusions. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given zero parameters, a present output schema, and annotations covering safety, the description is complete. It explains what the tool checks, what it does not reveal, and the fact that it makes no external calls, leaving no material gaps for an agent selecting or invoking it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the schema coverage is 100%, so there is no additional parameter meaning to explain. The baseline of 4 applies, and the description appropriately focuses on behavior rather than parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Check whether the PowerOffice MCP process has the required environment variables') on a specific resource, making the tool's purpose immediately clear. It also distinguishes itself from sibling tools by focusing on configuration readiness rather than connection details or data operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implicitly establishes when to use this tool: as a preflight configuration check before invoking PowerOffice tools. The statement 'Does not call PowerOffice' clarifies it can be safely used for diagnostics without side effects, though it does not explicitly compare itself to alternatives like poweroffice_connection_info.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
poweroffice_connection_infoPowerOffice connection and privilegesARead-onlyIdempotent
Call GET /ClientIntegrationInformation to verify authentication and return the client subscriptions and API privileges granted to the configured integration.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| apiBaseUrl | Yes | |
| environment | Yes | |
| integration | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false, so no contradiction exists. The description adds the endpoint and the returned data (subscriptions, API privileges), which is useful context, but it does not disclose details like error behavior or authentication failure semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that front-loads the exact HTTP verb and endpoint, then states the purpose and return value. There is no wasted language or redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-input, read-only tool with rich annotations and an existing output schema, the description is complete enough to guide invocation. It names the endpoint, explains the purpose, and states what information is returned, which is sufficient for an agent to use it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters and the schema coverage is complete, so the description carries no parameter burden. A 0-parameter tool with an empty schema gets a baseline of 4; the description appropriately focuses on behavior and result rather than parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Call GET /ClientIntegrationInformation') and the resource, plus the purpose: verifying authentication and returning client subscriptions and API privileges. It is clear and distinct in meaning, though it does not explicitly differentiate itself from the similarly named sibling poweroffice_configuration_status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is used to verify authentication and check privileges, but it gives no explicit guidance on when to use it versus alternatives, nor any exclusion criteria. There is no mention of how this relates to poweroffice_configuration_status or when a connection check is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
poweroffice_create_customerCreate a PowerOffice customerA
Create one customer with POST /Customers. This writes to the configured PowerOffice client. Set confirm=true only after the user has explicitly approved the exact customer data.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | Yes | Required explicit confirmation that this exact customer may be created | |
| customer | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| resource | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate this is a write operation and not idempotent. The description adds valuable behavioral context beyond that: it writes to the configured PowerOffice client and requires explicit user approval before confirm=true. No contradiction with annotations was found.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences, front-loads the core action, and each sentence earns its place. The approval warning is critical and placed at the end without unnecessary padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that a detailed output schema exists and annotations cover the write/non-idempotent behavior, the description is largely sufficient. It captures the essential operational context: endpooint, target client, and the mandatory user-approval condition. It does not explain duplicate risk explicitly, but the non-idempotent annotation covers that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 50%, with confirm documented but customer not described. The description adds useful meaning for confirm ('only after the user has explicitly approved the exact customer data') but does not clarify semantics of the large customer object beyond what the schema's field names and constraints already convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Create one customer'), a concrete HTTP resource ('POST /Customers'), and a clear scope ('one customer'). This clearly distinguishes it from siblings like update_customer, search_customers, and get_customer without needing to open the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool: creating exactly one customer, and it adds a critical usage guardrail around confirm=true. However, it does not explicitly name alternatives such as update_customer for existing customers or search_customers for lookups, so exclusion guidance is absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
poweroffice_create_general_ledger_accountCreate a PowerOffice general ledger accountA
Create one general ledger account with POST /GeneralLedgerAccounts. VatCode or VatCodeId is required. Set confirm=true only after the user has explicitly approved the exact account data.
| Name | Required | Description | Default |
|---|---|---|---|
| account | Yes | ||
| confirm | Yes | Required explicit confirmation that this exact account may be created |
Output Schema
| Name | Required | Description |
|---|---|---|
| resource | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds meaningful behavior beyond the annotations by identifying the HTTP POST endpoint and, more importantly, the consent gate: confirm=true must only be set after explicit user approval. This is consistent with readOnlyHint=false and adds a practical safety constraint not present in the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences carry the endpoint, a required-field rule, and a confirmation safeguard. Every sentence earns its place, and the most important operational constraint is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a nested-object creation tool, the description covers the critical details needed to invoke it: endpoint, required VatCode/VatCodeId, and the confirmation gate. Output schema handles return values, and the remaining gaps are minor relative to the annotation coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 50%, and the description partly compensates by adding the external requirement that VatCode or VatCodeId be provided. However, the many nested account fields still lack explanatory context, so the description does not fully bridge the gap between the schema and the API's actual requirements.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the operation explicitly: 'Create one general ledger account with POST /GeneralLedgerAccounts.' The endpoint and resource make it clear which action is performed and distinguish it from siblings like poweroffice_list_general_ledger_accounts and poweroffice_update_general_ledger_account.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear usage context: VatCode or VatCodeId is required, and confirm=true is only allowed after explicit user approval of the exact account data. It does not explicitly name alternative tools or when-not-to-use conditions, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
poweroffice_get_customerGet a PowerOffice customerARead-onlyIdempotent
Read one customer by PowerOffice numeric ID from GET /Customers/{id}. Returns a compact field set unless Fields is supplied.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| fields | No | PowerOffice Fields expression. Omit for the MCP compact default |
Output Schema
| Name | Required | Description |
|---|---|---|
| customer | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, and non-destructive behavior. The description adds valuable behavioral context by noting the compact default field set and the effect of supplying Fields. It does not discuss error behavior or auth, but for a simple read with strong annotations this is sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly written sentences with no filler. The core operation and endpoint are front-loaded, and the field-set behavior is stated in a single follow-up sentence. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple: one required ID parameter and one optional fields parameter. The description addresses both, names the endpoint, and the output schema covers return values. Nothing critical is missing for an agent to call this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50% because id lacks a description. The description compensates by explaining that id is the PowerOffice numeric ID and by clarifying that fields controls whether the compact or full field set is returned. This adds meaningful semantics beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Read'), a specific resource ('one customer by PowerOffice numeric ID'), and the exact endpoint ('GET /Customers/{id}'). This clearly distinguishes the tool from siblings like poweroffice_search_customers, poweroffice_create_customer, and poweroffice_update_customer.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies usage when you already have a PowerOffice numeric ID and need a single customer. It does not explicitly mention alternatives or when not to use the tool, but the context is clear enough for an agent to select it over search or mutation tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
poweroffice_list_account_transactionsList PowerOffice account transactionsARead-onlyIdempotent
Read posted account transactions from GET /AccountTransactions for an inclusive date range. Use filters and small pages to keep accounting queries narrow.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | PowerOffice Fields expression. Omit for the MCP compact default | |
| toDate | Yes | Inclusive posting date, YYYY-MM-DD | |
| orderBy | No | PowerOffice OrderBy expression | |
| fromDate | Yes | Inclusive posting date, YYYY-MM-DD | |
| pageSize | No | ||
| vatCodes | No | VAT codes, comma separated | |
| accountNos | No | Account numbers or ranges, for example 1000-1999,2500,3000- | |
| pageNumber | No | ||
| voucherNos | No | Voucher numbers or ranges in PowerOffice syntax | |
| productCodes | No | Product codes, comma separated | |
| projectCodes | No | Project codes, comma separated | |
| voucherTypes | No | Voucher types, comma separated | |
| departmentCodes | No | Department codes, comma separated | |
| includeSubProject | No | ||
| useDatabaseValidation | No | ||
| agricultureDepartments | No | ||
| createdDateTimeOffsetGreaterThan | No | Only entries created after this ISO timestamp | |
| lastChangedDateTimeOffsetGreaterThan | No | Only entries changed after this ISO timestamp |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint, openWorldHint, idempotentHint, and destructiveHint. The description adds behavioral context beyond the annotations by noting the inclusive date range and advising narrow queries, which signals that this operation can be expensive if not filtered. This is consistent with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences. The first sentence states the action and resource, the second provides practical guidance. No filler or repetition; every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values are covered elsewhere. The annotations carry the safety profile. The description adequately covers purpose and high-level invocation strategy for a tool with 18 parameters, though it could mention the default pageSize or the most commonly used filters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema describes most parameters, with 72% coverage. The description itself adds little parameter-specific meaning—'inclusive date range' merely restates schema descriptions, and 'use filters' is generic. It does not compensate for the few undocumented parameters like agricultureDepartments or includeSubProject.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb ('Read') and resource ('posted account transactions') and even names the API endpoint (GET /AccountTransactions). This distinguishes it from sibling tools that deal with customers or general ledger accounts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description offers clear usage guidance: use filters and small pages to keep accounting queries narrow. It does not explicitly name alternatives or exclusions, but no sibling tool overlaps with this functionality, so the absence of an explicit when-not-to-use is not a significant gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
poweroffice_list_general_ledger_accountsList PowerOffice general ledger accountsARead-onlyIdempotent
Read a paginated list from GET /GeneralLedgerAccounts. Supports account ranges such as 1000-1999,2500,3000-.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | PowerOffice Fields expression. Omit for the MCP compact default | |
| orderBy | No | PowerOffice OrderBy expression | |
| pageSize | No | ||
| accountNos | No | Account numbers or ranges in PowerOffice syntax | |
| pageNumber | No | ||
| useDatabaseValidation | No | ||
| agricultureDepartments | No | Agriculture departments, comma separated | |
| lastChangedDateTimeOffsetGreaterThan | No | Only accounts changed after this ISO timestamp |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the operation safe, read-only, idempotent, and non-destructive. The description adds meaningful behavior beyond annotations by revealing pagination behavior, the exact endpoint, and support for account range syntax like '1000-1999,2500,3000-'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no filler. The core action and resource are front-loaded, and the account range example is the only extra detail provided, all of which is useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Between the description, the read-only annotations, the output schema, and schema parameter descriptions, the tool is mostly self-sufficient. The main gaps are lack of routing guidance to sibling tools and no explanation of ambiguous parameters like useDatabaseValidation, but this is not critical for a read-only list operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides descriptions for 63% of parameters. The description adds valuable semantic context for accountNos by showing concrete syntax examples, and clarifies pagination behavior which helps interpret pageNumber and pageSize. A few schema-uncovered parameters like useDatabaseValidation remain unexplained, but the description is not solely responsible since coverage is above 50%.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Read'), a specific resource ('GET /GeneralLedgerAccounts'), and states it returns a paginated list. This clearly differentiates it from creating/updating general ledger accounts and from listing account transactions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for reading a paginated list of general ledger accounts, but it does not explicitly state when to use this tool versus alternatives such as create/update_general_ledger_account or list_account_transactions. There is no 'when not to use' or sibling-specific routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
poweroffice_search_customersSearch PowerOffice customersARead-onlyIdempotent
Read a paginated list from GET /Customers. Filters that accept multiple values use PowerOffice comma-separated syntax. Returns a compact field set unless Fields is supplied.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | PowerOffice Fields expression. Omit for the MCP compact default | |
| orderBy | No | PowerOffice OrderBy expression | |
| pageSize | No | ||
| pageNumber | No | ||
| customerNos | No | Customer numbers, comma separated | |
| externalNos | No | External numbers, comma separated | |
| phoneNumbers | No | Phone numbers, comma separated | |
| emailAddresses | No | Email addresses, comma separated | |
| contactGroupIds | No | Contact group IDs, comma separated | |
| organizationNumbers | No | Organization numbers, comma separated | |
| useDatabaseValidation | No | ||
| externalImportReference | No | ||
| lastChangedDateTimeOffsetGreaterThan | No | Only customers changed after this ISO timestamp | |
| customerCreatedDateTimeOffsetGreaterThan | No | Only customers created after this ISO timestamp |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnly/idempotent/openWorld/non-destructive signals; the description adds useful behavior beyond those: the endpoint is paginated, multi-value filters follow PowerOffice comma-separated syntax, and response fields are compact unless Fields is supplied. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences front-load the core action and endpoint, then pack filter syntax and response default into the remaining space. Every sentence earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter search tool, this is reasonably complete: it covers endpoint, pagination, filter syntax, and default field selection, while annotations and output schema cover safety and return value shape. It could add filter-combination semantics or examples for the ambiguous parameters, leaving minor gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers about 71% of parameters, and the description adds a meaningful default for fields (compact field set unless supplied) plus a general rule for multi-value filter parameters. A few parameters such as useDatabaseValidation remain unexplained, so it is not a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Read a paginated list from GET /Customers.' It clearly identifies this as a list/search operation over customers, and the plural 'list' differentiates it from sibling get_customer without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description establishes clear usage context: an agent should call this when it needs a paginated, filterable list of customers, and the compact-field behavior is stated. It does not explicitly name alternatives or exclusions, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
poweroffice_update_customerUpdate a PowerOffice customerADestructiveIdempotent
Update one customer with JSON Patch at PATCH /Customers/{id}. Only mutable CustomerPatchDto paths are accepted. Set confirm=true only after the user has explicitly approved the exact changes.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| patch | Yes | ||
| confirm | Yes | Required explicit confirmation that these exact customer changes may be applied |
Output Schema
| Name | Required | Description |
|---|---|---|
| resource | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructive and non-read-only behavior, but the description adds important behavioral context: only mutable CustomerPatchDto paths are accepted, and confirm=true requires explicit user approval of the exact changes. This goes beyond a simple 'update' statement and clarifies safety-critical behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, each earning its place: the first defines the operation and endpoint, the second constrains allowed patch paths, and the third states the confirmation requirement. No filler or redundant restatement of the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the key operational concerns for a destructive update: allowed paths and explicit confirmation. It does not enumerate the actual mutable CustomerPatchDto paths, which would require an agent to know them from elsewhere, but the endpoint, annotations, and output schema cover most remaining context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With only 33% schema description coverage, the description compensates by explaining that patch is JSON Patch, restricting it to mutable CustomerPatchDto paths, and defining confirm as an explicit user-approval flag. The id parameter is inferable from the endpoint /Customers/{id}.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb, resource, and endpoint: 'Update one customer with JSON Patch at PATCH /Customers/{id}'. It clearly distinguishes this from sibling tools like poweroffice_create_customer, poweroffice_get_customer, and poweroffice_search_customers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives operational guidance, especially the explicit confirmation requirement for confirm=true, but it does not name alternatives or state when to use this tool versus create_or_get variants. Usage context is implied by the tool name and endpoint rather than explicitly spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
poweroffice_update_general_ledger_accountUpdate a PowerOffice general ledger accountADestructiveIdempotent
Update one general ledger account with JSON Patch at PATCH /GeneralLedgerAccounts/{id}. Only mutable account paths are accepted. Set confirm=true only after the user has explicitly approved the exact changes.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| patch | Yes | ||
| confirm | Yes | Required explicit confirmation that these exact account changes may be applied |
Output Schema
| Name | Required | Description |
|---|---|---|
| resource | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavioral context beyond annotations: only mutable account paths are accepted, and confirm=true must only be set after the user explicitly approves the exact changes. This helps the agent avoid destructive or unauthorized modifications. It does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences deliver the endpoint, operation type, mutation constraint, and the critical confirmation requirement. There is no filler or redundant repetition of the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description provides the key operational details: what is updated, how it is updated, what restrictions apply, and when confirm may be true. The output schema covers return values, so no additional response description is needed. It could be more complete by listing which account paths are mutable, but that is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema documents only the confirm parameter, leaving id and patch with no description. The description compensates by clarifying that patch paths must be mutable and that confirm is an explicit user-approval flag. While id still lacks explanation, its purpose is evident from the endpoint.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: updating a single general ledger account using JSON Patch, and specifies the exact endpoint. It distinguishes this tool from siblings like create_general_ledger_account and list_general_ledger_accounts by emphasizing 'Update one' and the PATCH method.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It is clear this tool is for modifying an existing general ledger account by id. It provides no explicit when-not-to-use guidance or comparison with alternatives, but the 'Update one' phrasing and endpoint make the intended context unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
10 tool updates
v0.1.0- First observed
poweroffice_configuration_status - First observed
poweroffice_connection_info - First observed
poweroffice_create_customer - First observed
poweroffice_create_general_ledger_account - First observed
poweroffice_get_customer - First observed
poweroffice_list_account_transactions - First observed
poweroffice_list_general_ledger_accounts - First observed
poweroffice_search_customers - First observed
poweroffice_update_customer - First observed
poweroffice_update_general_ledger_account
TDQS
Scored across 10 tools
Each tool targets a distinct resource and action: connection info, configuration status, customer CRUD/search, general ledger account CRUD/list, and account transactions. Even the similar list/search/get operations are clearly separated by resource type and described filters.
Tool names consistently use the poweroffice_ prefix and mostly follow a verb_noun pattern such as create_customer, update_customer, list_account_transactions. The two status/info tools break the pattern slightly, but the overall style is uniform and predictable.
Ten tools is a well-scoped size for a PowerOffice MCP server covering customers, general ledger accounts, transactions, and connection diagnostics. Each tool serves a clear purpose without redundancy or bloat.
The server covers the main customer and general ledger account workflows including create, update, and read operations, plus transaction listing. Minor gaps exist such as no single-account fetch for general ledger accounts and no delete operations, but these are not critical for common integration workflows.
Maintenance
Related MCP Connectors
OAuth access to owned products, lead search, parcel search, and stored property audits.
1Read-only access to Genie accounts, transactions, investments, and financial summaries.
Manage Apollo invoices and customers with entity-scoped OAuth and optional read/write access.
Read-only access to your CodeMouse accounts, repositories, and AI pull-request reviews.
Related MCP Servers
- -licenseNot gradedqualityNot gradedmaintenanceEnables Codex to create, update, review, and present live SceneBoard boards after user approves a one-time connection.-
- AlicenseNot gradedqualityBmaintenanceEnables guardians to securely query read-only Vklass data such as children, news, calendar entries, assignments, grades, meals, and notifications through MCP, with per-user BankID and OAuth 2.1 authentication.MIT
- FlicenseNot gradedqualityCmaintenanceEnables Codex to access Feishu knowledge bases and authorized shared cloud drives, allowing listing, searching, and reading wikis, documents, spreadsheets, bitable, and files, with scoped and approval-gated create and edit capabilities.-
- AlicenseNot gradedqualityBmaintenanceEnables MCP-compatible agents to securely access an Invoice4U account for searching documents and customers and creating receipts linked to paid invoices, with read-only behavior by default.MIT