smallinvoice MCP by usefulapi
Read smallinvoice contacts, invoices, offers, projects and hours; create contacts and invoices.
我该使用它吗
质量与安全性
发现(9)
- LOW在 smallinvoice_list_contact_addresses 中
- LOW在 smallinvoice_list_contact_people 中
- LOW在 smallinvoice_list_contact_groups 中
- LOW在 smallinvoice_list_invoice_payments 中
- LOW在 smallinvoice_list_order_confirmations 中
- LOW在 smallinvoice_get_order_confirmation 中
- LOW在 smallinvoice_list_delivery_notes 中
- LOW在 smallinvoice_list_bank_accounts 中
- LOW在 smallinvoice_list_working_hours 中
基于对工具定义和协议合规性的自动分析。
上下文开销
这是每次将服务器的工具加载到模型上下文窗口时所消耗的大致 token 数。数值越高,可用于其他任务的注意力就越少。
安装
一键安装
将以下内容添加到你的 `claude_desktop_config.json` 文件中:
{
"mcpServers": {
"smallinvoice": {
"url": "https://smallinvoice.usefulapi.io/mcp"
}
}
}远程端点
https://smallinvoice.usefulapi.io/mcpstreamable-http它能做什么
工具清单
工具(27)
🟢smallinvoice_get_owner
The smallinvoice account the API client belongs to (the owner's id and details). A cheap check that the connection works. GET /auth/owner.
输入模式
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢smallinvoice_list_contacts(q, filter, sort, with, limit, ...)
List contacts (customers and suppliers): name, type (company or person), relation, e-mail, currency. Add with=main_address for the address. Needs the "contact" scope. GET /contacts. Returns count, total, next_offset (pass it as offset for the next page) and the items.
输入模式
{
"type": "object",
"properties": {
"q": {
"type": "string",
"maxLength": 200,
"description": "Optional free-text search over several fields."
},
"filter": {
"type": "string",
"maxLength": 2000,
"description": "Optional filter as a JSON object string, e.g. {\"currency\":\"CHF\"}; combine with {\"and\":[...]} / {\"or\":[...]}. Comparators go before the value: \"<\", \"<=\", \">\", \">=\", \"!\" (not), \"~\" (contains), e.g. {\"name\":\"~ACME\"}. Unknown field names are answered with HTTP 400."
},
"sort": {
"type": "string",
"maxLength": 200,
"pattern": "^-?[A-Za-z0-9_.]+(,-?[A-Za-z0-9_.]+)*$",
"description": "Optional sort: 'name' ascending, '-name' descending, '-surname,name' for several."
},
"with": {
"type": "string",
"maxLength": 200,
"pattern": "^[A-Za-z0-9_.]+(,[A-Za-z0-9_.]+)*$",
"description": "Optional extra fields to include, comma separated (e.g. 'main_address' on contacts)."
},
"limit": {
"description": "Items per page (default 100, max 200).",
"type": "integer",
"minimum": 1,
"maximum": 200
},
"offset": {
"description": "Items to skip (paging: the previous reply's next_offset).",
"type": "integer",
"minimum": 0,
"maximum": 1000000
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢smallinvoice_get_contact(id, with)
One contact by id, with its fields. Add with=main_address for the main address. Needs the "contact" scope. GET /contacts/{id}.
输入模式
{
"type": "object",
"properties": {
"id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "The contact id (from smallinvoice_list_contacts)."
},
"with": {
"type": "string",
"maxLength": 200,
"pattern": "^[A-Za-z0-9_.]+(,[A-Za-z0-9_.]+)*$",
"description": "Optional extra fields to include, comma separated (e.g. 'main_address' on contacts)."
}
},
"required": [
"id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢smallinvoice_list_contact_addresses(contact_id, limit, offset)
All addresses of one contact. Needs the "contact" scope. GET /contacts/{contactId}/addresses.
输入模式
{
"type": "object",
"properties": {
"contact_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "The contact id."
},
"limit": {
"description": "Items per page (default 100, max 200).",
"type": "integer",
"minimum": 1,
"maximum": 200
},
"offset": {
"description": "Items to skip (paging: the previous reply's next_offset).",
"type": "integer",
"minimum": 0,
"maximum": 1000000
}
},
"required": [
"contact_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢smallinvoice_list_contact_people(contact_id, limit, offset)
The contact persons of one company contact. Needs the "contact" scope. GET /contacts/{contactId}/people.
输入模式
{
"type": "object",
"properties": {
"contact_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "The contact id."
},
"limit": {
"description": "Items per page (default 100, max 200).",
"type": "integer",
"minimum": 1,
"maximum": 200
},
"offset": {
"description": "Items to skip (paging: the previous reply's next_offset).",
"type": "integer",
"minimum": 0,
"maximum": 1000000
}
},
"required": [
"contact_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢smallinvoice_list_contact_groups(q, filter, sort, with, limit, ...)
List the contact groups. Needs the "contact" scope. GET /contacts/configuration/groups. Returns count, total, next_offset (pass it as offset for the next page) and the items.
输入模式
{
"type": "object",
"properties": {
"q": {
"type": "string",
"maxLength": 200,
"description": "Optional free-text search over several fields."
},
"filter": {
"type": "string",
"maxLength": 2000,
"description": "Optional filter as a JSON object string, e.g. {\"currency\":\"CHF\"}; combine with {\"and\":[...]} / {\"or\":[...]}. Comparators go before the value: \"<\", \"<=\", \">\", \">=\", \"!\" (not), \"~\" (contains), e.g. {\"name\":\"~ACME\"}. Unknown field names are answered with HTTP 400."
},
"sort": {
"type": "string",
"maxLength": 200,
"pattern": "^-?[A-Za-z0-9_.]+(,-?[A-Za-z0-9_.]+)*$",
"description": "Optional sort: 'name' ascending, '-name' descending, '-surname,name' for several."
},
"with": {
"type": "string",
"maxLength": 200,
"pattern": "^[A-Za-z0-9_.]+(,[A-Za-z0-9_.]+)*$",
"description": "Optional extra fields to include, comma separated (e.g. 'main_address' on contacts)."
},
"limit": {
"description": "Items per page (default 100, max 200).",
"type": "integer",
"minimum": 1,
"maximum": 200
},
"offset": {
"description": "Items to skip (paging: the previous reply's next_offset).",
"type": "integer",
"minimum": 0,
"maximum": 1000000
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢smallinvoice_list_invoices(q, filter, sort, with, limit, ...)
List invoices: number, contact, dates, total, currency, status. Filter by contact_id or a JSON filter. Needs the "invoice" scope. GET /receivables/invoices. Returns count, total, next_offset (pass it as offset for the next page) and the items.
输入模式
{
"type": "object",
"properties": {
"q": {
"type": "string",
"maxLength": 200,
"description": "Optional free-text search over several fields."
},
"filter": {
"type": "string",
"maxLength": 2000,
"description": "Optional filter as a JSON object string, e.g. {\"currency\":\"CHF\"}; combine with {\"and\":[...]} / {\"or\":[...]}. Comparators go before the value: \"<\", \"<=\", \">\", \">=\", \"!\" (not), \"~\" (contains), e.g. {\"name\":\"~ACME\"}. Unknown field names are answered with HTTP 400."
},
"sort": {
"type": "string",
"maxLength": 200,
"pattern": "^-?[A-Za-z0-9_.]+(,-?[A-Za-z0-9_.]+)*$",
"description": "Optional sort: 'name' ascending, '-name' descending, '-surname,name' for several."
},
"with": {
"type": "string",
"maxLength": 200,
"pattern": "^[A-Za-z0-9_.]+(,[A-Za-z0-9_.]+)*$",
"description": "Optional extra fields to include, comma separated (e.g. 'main_address' on contacts)."
},
"limit": {
"description": "Items per page (default 100, max 200).",
"type": "integer",
"minimum": 1,
"maximum": 200
},
"offset": {
"description": "Items to skip (paging: the previous reply's next_offset).",
"type": "integer",
"minimum": 0,
"maximum": 1000000
},
"contact_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Only documents of this contact (customer) id."
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢smallinvoice_get_invoice(id, with)
One invoice by id with its positions, totals and status. Needs the "invoice" scope. GET /receivables/invoices/{id}.
输入模式
{
"type": "object",
"properties": {
"id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "The invoice id (from smallinvoice_list_invoices)."
},
"with": {
"type": "string",
"maxLength": 200,
"pattern": "^[A-Za-z0-9_.]+(,[A-Za-z0-9_.]+)*$",
"description": "Optional extra fields to include, comma separated (e.g. 'main_address' on contacts)."
}
},
"required": [
"id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢smallinvoice_list_invoice_payments(invoice_id, limit, offset)
The payments recorded on one invoice. Needs the "invoice" scope. GET /receivables/invoices/{invoiceId}/payments.
输入模式
{
"type": "object",
"properties": {
"invoice_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "The invoice id."
},
"limit": {
"description": "Items per page (default 100, max 200).",
"type": "integer",
"minimum": 1,
"maximum": 200
},
"offset": {
"description": "Items to skip (paging: the previous reply's next_offset).",
"type": "integer",
"minimum": 0,
"maximum": 1000000
}
},
"required": [
"invoice_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢smallinvoice_list_offers(q, filter, sort, with, limit, ...)
List offers (quotes). Filter by contact_id or a JSON filter. Needs the "offer" scope. GET /receivables/offers. Returns count, total, next_offset (pass it as offset for the next page) and the items.
输入模式
{
"type": "object",
"properties": {
"q": {
"type": "string",
"maxLength": 200,
"description": "Optional free-text search over several fields."
},
"filter": {
"type": "string",
"maxLength": 2000,
"description": "Optional filter as a JSON object string, e.g. {\"currency\":\"CHF\"}; combine with {\"and\":[...]} / {\"or\":[...]}. Comparators go before the value: \"<\", \"<=\", \">\", \">=\", \"!\" (not), \"~\" (contains), e.g. {\"name\":\"~ACME\"}. Unknown field names are answered with HTTP 400."
},
"sort": {
"type": "string",
"maxLength": 200,
"pattern": "^-?[A-Za-z0-9_.]+(,-?[A-Za-z0-9_.]+)*$",
"description": "Optional sort: 'name' ascending, '-name' descending, '-surname,name' for several."
},
"with": {
"type": "string",
"maxLength": 200,
"pattern": "^[A-Za-z0-9_.]+(,[A-Za-z0-9_.]+)*$",
"description": "Optional extra fields to include, comma separated (e.g. 'main_address' on contacts)."
},
"limit": {
"description": "Items per page (default 100, max 200).",
"type": "integer",
"minimum": 1,
"maximum": 200
},
"offset": {
"description": "Items to skip (paging: the previous reply's next_offset).",
"type": "integer",
"minimum": 0,
"maximum": 1000000
},
"contact_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Only documents of this contact (customer) id."
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢smallinvoice_get_offer(id, with)
One offer (quote) by id with its positions and totals. Needs the "offer" scope. GET /receivables/offers/{id}.
输入模式
{
"type": "object",
"properties": {
"id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "The offer id (from smallinvoice_list_offers)."
},
"with": {
"type": "string",
"maxLength": 200,
"pattern": "^[A-Za-z0-9_.]+(,[A-Za-z0-9_.]+)*$",
"description": "Optional extra fields to include, comma separated (e.g. 'main_address' on contacts)."
}
},
"required": [
"id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢smallinvoice_list_order_confirmations(q, filter, sort, with, limit, ...)
List order confirmations. Filter by contact_id or a JSON filter. Needs the "order_confirmation" scope. GET /receivables/order-confirmations. Returns count, total, next_offset (pass it as offset for the next page) and the items.
输入模式
{
"type": "object",
"properties": {
"q": {
"type": "string",
"maxLength": 200,
"description": "Optional free-text search over several fields."
},
"filter": {
"type": "string",
"maxLength": 2000,
"description": "Optional filter as a JSON object string, e.g. {\"currency\":\"CHF\"}; combine with {\"and\":[...]} / {\"or\":[...]}. Comparators go before the value: \"<\", \"<=\", \">\", \">=\", \"!\" (not), \"~\" (contains), e.g. {\"name\":\"~ACME\"}. Unknown field names are answered with HTTP 400."
},
"sort": {
"type": "string",
"maxLength": 200,
"pattern": "^-?[A-Za-z0-9_.]+(,-?[A-Za-z0-9_.]+)*$",
"description": "Optional sort: 'name' ascending, '-name' descending, '-surname,name' for several."
},
"with": {
"type": "string",
"maxLength": 200,
"pattern": "^[A-Za-z0-9_.]+(,[A-Za-z0-9_.]+)*$",
"description": "Optional extra fields to include, comma separated (e.g. 'main_address' on contacts)."
},
"limit": {
"description": "Items per page (default 100, max 200).",
"type": "integer",
"minimum": 1,
"maximum": 200
},
"offset": {
"description": "Items to skip (paging: the previous reply's next_offset).",
"type": "integer",
"minimum": 0,
"maximum": 1000000
},
"contact_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Only documents of this contact (customer) id."
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢smallinvoice_get_order_confirmation(id, with)
One order confirmation by id. Needs the "order_confirmation" scope. GET /receivables/order-confirmations/{id}.
输入模式
{
"type": "object",
"properties": {
"id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "The order confirmation id."
},
"with": {
"type": "string",
"maxLength": 200,
"pattern": "^[A-Za-z0-9_.]+(,[A-Za-z0-9_.]+)*$",
"description": "Optional extra fields to include, comma separated (e.g. 'main_address' on contacts)."
}
},
"required": [
"id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢smallinvoice_list_delivery_notes(q, filter, sort, with, limit, ...)
List delivery notes. Filter by contact_id or a JSON filter. Needs the "delivery_note" scope. GET /receivables/delivery-notes. Returns count, total, next_offset (pass it as offset for the next page) and the items.
输入模式
{
"type": "object",
"properties": {
"q": {
"type": "string",
"maxLength": 200,
"description": "Optional free-text search over several fields."
},
"filter": {
"type": "string",
"maxLength": 2000,
"description": "Optional filter as a JSON object string, e.g. {\"currency\":\"CHF\"}; combine with {\"and\":[...]} / {\"or\":[...]}. Comparators go before the value: \"<\", \"<=\", \">\", \">=\", \"!\" (not), \"~\" (contains), e.g. {\"name\":\"~ACME\"}. Unknown field names are answered with HTTP 400."
},
"sort": {
"type": "string",
"maxLength": 200,
"pattern": "^-?[A-Za-z0-9_.]+(,-?[A-Za-z0-9_.]+)*$",
"description": "Optional sort: 'name' ascending, '-name' descending, '-surname,name' for several."
},
"with": {
"type": "string",
"maxLength": 200,
"pattern": "^[A-Za-z0-9_.]+(,[A-Za-z0-9_.]+)*$",
"description": "Optional extra fields to include, comma separated (e.g. 'main_address' on contacts)."
},
"limit": {
"description": "Items per page (default 100, max 200).",
"type": "integer",
"minimum": 1,
"maximum": 200
},
"offset": {
"description": "Items to skip (paging: the previous reply's next_offset).",
"type": "integer",
"minimum": 0,
"maximum": 1000000
},
"contact_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Only documents of this contact (customer) id."
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢smallinvoice_get_delivery_note(id, with)
One delivery note by id. Needs the "delivery_note" scope. GET /receivables/delivery-notes/{id}.
输入模式
{
"type": "object",
"properties": {
"id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "The delivery note id."
},
"with": {
"type": "string",
"maxLength": 200,
"pattern": "^[A-Za-z0-9_.]+(,[A-Za-z0-9_.]+)*$",
"description": "Optional extra fields to include, comma separated (e.g. 'main_address' on contacts)."
}
},
"required": [
"id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢smallinvoice_list_products(q, filter, sort, with, limit, ...)
List the catalog's products (articles). Needs the "catalog" scope. GET /catalog/products. Returns count, total, next_offset (pass it as offset for the next page) and the items.
输入模式
{
"type": "object",
"properties": {
"q": {
"type": "string",
"maxLength": 200,
"description": "Optional free-text search over several fields."
},
"filter": {
"type": "string",
"maxLength": 2000,
"description": "Optional filter as a JSON object string, e.g. {\"currency\":\"CHF\"}; combine with {\"and\":[...]} / {\"or\":[...]}. Comparators go before the value: \"<\", \"<=\", \">\", \">=\", \"!\" (not), \"~\" (contains), e.g. {\"name\":\"~ACME\"}. Unknown field names are answered with HTTP 400."
},
"sort": {
"type": "string",
"maxLength": 200,
"pattern": "^-?[A-Za-z0-9_.]+(,-?[A-Za-z0-9_.]+)*$",
"description": "Optional sort: 'name' ascending, '-name' descending, '-surname,name' for several."
},
"with": {
"type": "string",
"maxLength": 200,
"pattern": "^[A-Za-z0-9_.]+(,[A-Za-z0-9_.]+)*$",
"description": "Optional extra fields to include, comma separated (e.g. 'main_address' on contacts)."
},
"limit": {
"description": "Items per page (default 100, max 200).",
"type": "integer",
"minimum": 1,
"maximum": 200
},
"offset": {
"description": "Items to skip (paging: the previous reply's next_offset).",
"type": "integer",
"minimum": 0,
"maximum": 1000000
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢smallinvoice_list_services(q, filter, sort, with, limit, ...)
List the catalog's services. Needs the "catalog" scope. GET /catalog/services. Returns count, total, next_offset (pass it as offset for the next page) and the items.
输入模式
{
"type": "object",
"properties": {
"q": {
"type": "string",
"maxLength": 200,
"description": "Optional free-text search over several fields."
},
"filter": {
"type": "string",
"maxLength": 2000,
"description": "Optional filter as a JSON object string, e.g. {\"currency\":\"CHF\"}; combine with {\"and\":[...]} / {\"or\":[...]}. Comparators go before the value: \"<\", \"<=\", \">\", \">=\", \"!\" (not), \"~\" (contains), e.g. {\"name\":\"~ACME\"}. Unknown field names are answered with HTTP 400."
},
"sort": {
"type": "string",
"maxLength": 200,
"pattern": "^-?[A-Za-z0-9_.]+(,-?[A-Za-z0-9_.]+)*$",
"description": "Optional sort: 'name' ascending, '-name' descending, '-surname,name' for several."
},
"with": {
"type": "string",
"maxLength": 200,
"pattern": "^[A-Za-z0-9_.]+(,[A-Za-z0-9_.]+)*$",
"description": "Optional extra fields to include, comma separated (e.g. 'main_address' on contacts)."
},
"limit": {
"description": "Items per page (default 100, max 200).",
"type": "integer",
"minimum": 1,
"maximum": 200
},
"offset": {
"description": "Items to skip (paging: the previous reply's next_offset).",
"type": "integer",
"minimum": 0,
"maximum": 1000000
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢smallinvoice_list_units(q, filter, sort, with, limit, ...)
List the units (piece, hour, ...) with their ids, which an invoice position's unit_id refers to. Needs the "configuration" scope. GET /catalog/configuration/units. Returns count, total, next_offset (pass it as offset for the next page) and the items.
输入模式
{
"type": "object",
"properties": {
"q": {
"type": "string",
"maxLength": 200,
"description": "Optional free-text search over several fields."
},
"filter": {
"type": "string",
"maxLength": 2000,
"description": "Optional filter as a JSON object string, e.g. {\"currency\":\"CHF\"}; combine with {\"and\":[...]} / {\"or\":[...]}. Comparators go before the value: \"<\", \"<=\", \">\", \">=\", \"!\" (not), \"~\" (contains), e.g. {\"name\":\"~ACME\"}. Unknown field names are answered with HTTP 400."
},
"sort": {
"type": "string",
"maxLength": 200,
"pattern": "^-?[A-Za-z0-9_.]+(,-?[A-Za-z0-9_.]+)*$",
"description": "Optional sort: 'name' ascending, '-name' descending, '-surname,name' for several."
},
"with": {
"type": "string",
"maxLength": 200,
"pattern": "^[A-Za-z0-9_.]+(,[A-Za-z0-9_.]+)*$",
"description": "Optional extra fields to include, comma separated (e.g. 'main_address' on contacts)."
},
"limit": {
"description": "Items per page (default 100, max 200).",
"type": "integer",
"minimum": 1,
"maximum": 200
},
"offset": {
"description": "Items to skip (paging: the previous reply's next_offset).",
"type": "integer",
"minimum": 0,
"maximum": 1000000
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢smallinvoice_list_bank_accounts(q, filter, sort, with, limit, ...)
List the account's bank accounts (as printed on documents). Needs the "configuration" scope. GET /configuration/bank-accounts. Returns count, total, next_offset (pass it as offset for the next page) and the items.
输入模式
{
"type": "object",
"properties": {
"q": {
"type": "string",
"maxLength": 200,
"description": "Optional free-text search over several fields."
},
"filter": {
"type": "string",
"maxLength": 2000,
"description": "Optional filter as a JSON object string, e.g. {\"currency\":\"CHF\"}; combine with {\"and\":[...]} / {\"or\":[...]}. Comparators go before the value: \"<\", \"<=\", \">\", \">=\", \"!\" (not), \"~\" (contains), e.g. {\"name\":\"~ACME\"}. Unknown field names are answered with HTTP 400."
},
"sort": {
"type": "string",
"maxLength": 200,
"pattern": "^-?[A-Za-z0-9_.]+(,-?[A-Za-z0-9_.]+)*$",
"description": "Optional sort: 'name' ascending, '-name' descending, '-surname,name' for several."
},
"with": {
"type": "string",
"maxLength": 200,
"pattern": "^[A-Za-z0-9_.]+(,[A-Za-z0-9_.]+)*$",
"description": "Optional extra fields to include, comma separated (e.g. 'main_address' on contacts)."
},
"limit": {
"description": "Items per page (default 100, max 200).",
"type": "integer",
"minimum": 1,
"maximum": 200
},
"offset": {
"description": "Items to skip (paging: the previous reply's next_offset).",
"type": "integer",
"minimum": 0,
"maximum": 1000000
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢smallinvoice_list_projects(q, filter, sort, with, limit, ...)
List projects. Needs the "project" scope. GET /reporting/projects. Returns count, total, next_offset (pass it as offset for the next page) and the items.
输入模式
{
"type": "object",
"properties": {
"q": {
"type": "string",
"maxLength": 200,
"description": "Optional free-text search over several fields."
},
"filter": {
"type": "string",
"maxLength": 2000,
"description": "Optional filter as a JSON object string, e.g. {\"currency\":\"CHF\"}; combine with {\"and\":[...]} / {\"or\":[...]}. Comparators go before the value: \"<\", \"<=\", \">\", \">=\", \"!\" (not), \"~\" (contains), e.g. {\"name\":\"~ACME\"}. Unknown field names are answered with HTTP 400."
},
"sort": {
"type": "string",
"maxLength": 200,
"pattern": "^-?[A-Za-z0-9_.]+(,-?[A-Za-z0-9_.]+)*$",
"description": "Optional sort: 'name' ascending, '-name' descending, '-surname,name' for several."
},
"with": {
"type": "string",
"maxLength": 200,
"pattern": "^[A-Za-z0-9_.]+(,[A-Za-z0-9_.]+)*$",
"description": "Optional extra fields to include, comma separated (e.g. 'main_address' on contacts)."
},
"limit": {
"description": "Items per page (default 100, max 200).",
"type": "integer",
"minimum": 1,
"maximum": 200
},
"offset": {
"description": "Items to skip (paging: the previous reply's next_offset).",
"type": "integer",
"minimum": 0,
"maximum": 1000000
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢smallinvoice_get_project(id, with)
One project by id. Needs the "project" scope. GET /reporting/projects/{id}.
输入模式
{
"type": "object",
"properties": {
"id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "The project id (from smallinvoice_list_projects)."
},
"with": {
"type": "string",
"maxLength": 200,
"pattern": "^[A-Za-z0-9_.]+(,[A-Za-z0-9_.]+)*$",
"description": "Optional extra fields to include, comma separated (e.g. 'main_address' on contacts)."
}
},
"required": [
"id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢smallinvoice_list_working_hours(q, filter, sort, with, limit, ...)
List recorded working hours (time tracking entries). Needs the "working_hours" scope. GET /reporting/working-hours. Returns count, total, next_offset (pass it as offset for the next page) and the items.
输入模式
{
"type": "object",
"properties": {
"q": {
"type": "string",
"maxLength": 200,
"description": "Optional free-text search over several fields."
},
"filter": {
"type": "string",
"maxLength": 2000,
"description": "Optional filter as a JSON object string, e.g. {\"currency\":\"CHF\"}; combine with {\"and\":[...]} / {\"or\":[...]}. Comparators go before the value: \"<\", \"<=\", \">\", \">=\", \"!\" (not), \"~\" (contains), e.g. {\"name\":\"~ACME\"}. Unknown field names are answered with HTTP 400."
},
"sort": {
"type": "string",
"maxLength": 200,
"pattern": "^-?[A-Za-z0-9_.]+(,-?[A-Za-z0-9_.]+)*$",
"description": "Optional sort: 'name' ascending, '-name' descending, '-surname,name' for several."
},
"with": {
"type": "string",
"maxLength": 200,
"pattern": "^[A-Za-z0-9_.]+(,[A-Za-z0-9_.]+)*$",
"description": "Optional extra fields to include, comma separated (e.g. 'main_address' on contacts)."
},
"limit": {
"description": "Items per page (default 100, max 200).",
"type": "integer",
"minimum": 1,
"maximum": 200
},
"offset": {
"description": "Items to skip (paging: the previous reply's next_offset).",
"type": "integer",
"minimum": 0,
"maximum": 1000000
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢smallinvoice_list_efforts(q, filter, sort, with, limit, ...)
List efforts (expenses and services recorded against projects). Needs the "effort" scope. GET /reporting/efforts. Returns count, total, next_offset (pass it as offset for the next page) and the items.
输入模式
{
"type": "object",
"properties": {
"q": {
"type": "string",
"maxLength": 200,
"description": "Optional free-text search over several fields."
},
"filter": {
"type": "string",
"maxLength": 2000,
"description": "Optional filter as a JSON object string, e.g. {\"currency\":\"CHF\"}; combine with {\"and\":[...]} / {\"or\":[...]}. Comparators go before the value: \"<\", \"<=\", \">\", \">=\", \"!\" (not), \"~\" (contains), e.g. {\"name\":\"~ACME\"}. Unknown field names are answered with HTTP 400."
},
"sort": {
"type": "string",
"maxLength": 200,
"pattern": "^-?[A-Za-z0-9_.]+(,-?[A-Za-z0-9_.]+)*$",
"description": "Optional sort: 'name' ascending, '-name' descending, '-surname,name' for several."
},
"with": {
"type": "string",
"maxLength": 200,
"pattern": "^[A-Za-z0-9_.]+(,[A-Za-z0-9_.]+)*$",
"description": "Optional extra fields to include, comma separated (e.g. 'main_address' on contacts)."
},
"limit": {
"description": "Items per page (default 100, max 200).",
"type": "integer",
"minimum": 1,
"maximum": 200
},
"offset": {
"description": "Items to skip (paging: the previous reply's next_offset).",
"type": "integer",
"minimum": 0,
"maximum": 1000000
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢smallinvoice_list_activities(q, filter, sort, with, limit, ...)
List activities (the kinds of work that hours are booked on). Needs the "activity" scope. GET /reporting/activities. Returns count, total, next_offset (pass it as offset for the next page) and the items.
输入模式
{
"type": "object",
"properties": {
"q": {
"type": "string",
"maxLength": 200,
"description": "Optional free-text search over several fields."
},
"filter": {
"type": "string",
"maxLength": 2000,
"description": "Optional filter as a JSON object string, e.g. {\"currency\":\"CHF\"}; combine with {\"and\":[...]} / {\"or\":[...]}. Comparators go before the value: \"<\", \"<=\", \">\", \">=\", \"!\" (not), \"~\" (contains), e.g. {\"name\":\"~ACME\"}. Unknown field names are answered with HTTP 400."
},
"sort": {
"type": "string",
"maxLength": 200,
"pattern": "^-?[A-Za-z0-9_.]+(,-?[A-Za-z0-9_.]+)*$",
"description": "Optional sort: 'name' ascending, '-name' descending, '-surname,name' for several."
},
"with": {
"type": "string",
"maxLength": 200,
"pattern": "^[A-Za-z0-9_.]+(,[A-Za-z0-9_.]+)*$",
"description": "Optional extra fields to include, comma separated (e.g. 'main_address' on contacts)."
},
"limit": {
"description": "Items per page (default 100, max 200).",
"type": "integer",
"minimum": 1,
"maximum": 200
},
"offset": {
"description": "Items to skip (paging: the previous reply's next_offset).",
"type": "integer",
"minimum": 0,
"maximum": 1000000
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢smallinvoice_list_cost_units(q, filter, sort, with, limit, ...)
List cost units. Needs the "cost_unit" scope. GET /reporting/cost-units. Returns count, total, next_offset (pass it as offset for the next page) and the items.
输入模式
{
"type": "object",
"properties": {
"q": {
"type": "string",
"maxLength": 200,
"description": "Optional free-text search over several fields."
},
"filter": {
"type": "string",
"maxLength": 2000,
"description": "Optional filter as a JSON object string, e.g. {\"currency\":\"CHF\"}; combine with {\"and\":[...]} / {\"or\":[...]}. Comparators go before the value: \"<\", \"<=\", \">\", \">=\", \"!\" (not), \"~\" (contains), e.g. {\"name\":\"~ACME\"}. Unknown field names are answered with HTTP 400."
},
"sort": {
"type": "string",
"maxLength": 200,
"pattern": "^-?[A-Za-z0-9_.]+(,-?[A-Za-z0-9_.]+)*$",
"description": "Optional sort: 'name' ascending, '-name' descending, '-surname,name' for several."
},
"with": {
"type": "string",
"maxLength": 200,
"pattern": "^[A-Za-z0-9_.]+(,[A-Za-z0-9_.]+)*$",
"description": "Optional extra fields to include, comma separated (e.g. 'main_address' on contacts)."
},
"limit": {
"description": "Items per page (default 100, max 200).",
"type": "integer",
"minimum": 1,
"maximum": 200
},
"offset": {
"description": "Items to skip (paging: the previous reply's next_offset).",
"type": "integer",
"minimum": 0,
"maximum": 1000000
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟡smallinvoice_create_contact(name, street, postcode, city, country, ...)
WRITE: creates a new company contact (customer) in smallinvoice, with its main address. Needs the "contact" scope. POST /contacts. Nothing is sent to anyone. Private persons are not supported here (smallinvoice needs more fields for them): create those in smallinvoice. Check smallinvoice_list_contacts first so you do not create a duplicate.
输入模式
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Company name, as printed on documents."
},
"street": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Main address: street and number."
},
"postcode": {
"type": "string",
"minLength": 1,
"maxLength": 20,
"description": "Main address: postcode."
},
"city": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "Main address: city."
},
"country": {
"type": "string",
"pattern": "^[A-Z]{2}$",
"description": "Main address: ISO country code, e.g. CH."
},
"relation": {
"description": "Relation codes (default ['CL'] = client, as in the vendor's example). See the vendor docs for the others.",
"maxItems": 5,
"type": "array",
"items": {
"type": "string",
"pattern": "^[A-Z]{2}$"
}
},
"email": {
"description": "E-mail address.",
"type": "string",
"maxLength": 200,
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
},
"currency": {
"description": "ISO currency, e.g. CHF or EUR.",
"type": "string",
"pattern": "^[A-Z]{3}$"
}
},
"required": [
"name",
"street",
"postcode",
"city",
"country"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟡smallinvoice_create_invoice(contact_id, contact_address_id, date, due, currency, ...)
WRITE: creates a new invoice for a contact. Needs the "invoice" scope. POST /receivables/invoices. It is only created: it is NOT sent by e-mail or post and its status is not changed; the user reviews it in smallinvoice. Not idempotent: calling it twice creates two invoices. Use smallinvoice_list_contacts / smallinvoice_list_units first for the ids.
输入模式
{
"type": "object",
"properties": {
"contact_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "The contact (customer) id."
},
"contact_address_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "The id of the contact's address to print (smallinvoice_list_contact_addresses, or main_address_id on the contact)."
},
"date": {
"type": "string",
"description": "Invoice date, yyyy-mm-dd."
},
"due": {
"type": "string",
"description": "Due date, yyyy-mm-dd."
},
"currency": {
"type": "string",
"pattern": "^[A-Z]{3}$",
"description": "ISO currency, e.g. CHF."
},
"language": {
"type": "string",
"pattern": "^[a-z]{2}$",
"description": "Document language: de, en, fr or it."
},
"positions": {
"minItems": 1,
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 300,
"description": "Position name."
},
"description": {
"description": "Position description.",
"type": "string",
"maxLength": 2000
},
"price": {
"type": "number",
"minimum": 0,
"maximum": 1000000000,
"description": "Unit price (net, in the invoice currency)."
},
"amount": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 1000000000,
"description": "Quantity."
},
"unit_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Unit id (smallinvoice_list_units)."
},
"vat": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "VAT percentage, e.g. 8.1."
},
"type": {
"description": "Position type (default 'N' = normal, as in the vendor's example).",
"type": "string",
"pattern": "^[A-Z]$"
},
"catalog_type": {
"description": "Catalog type (default 'P', as in the vendor's example).",
"type": "string",
"pattern": "^[A-Z]$"
}
},
"required": [
"name",
"price",
"amount",
"unit_id",
"vat"
]
},
"description": "The invoice positions."
}
},
"required": [
"contact_id",
"contact_address_id",
"date",
"due",
"currency",
"language",
"positions"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}社区
证据