MCP Buste Paga
Click on "Install 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., "@MCP Buste PagaShow my salary history for 2024"
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.
MCP Buste Paga
An MCP (Model Context Protocol) server that parses Italian INAZ payslip PDFs and stores them in a local SQLite database. Connect it to any MCP-compatible AI client to analyze your salary history, search payslip items, and get detailed breakdowns — all with your data staying on your machine.
Installation
Requirements: Python 3.10+, uv
Clone the repository and install dependencies:
git clone https://github.com/morettimarco/MCP-Buste-Paga.git
cd MCP-Buste-Paga
uv syncVerify it runs:
uv run mcp-buste-pagaRelated MCP server: Expense Tracker MCP Server
Ingesting payslips
Once the server is connected to an AI client (see below), ask the assistant to ingest your payslip PDFs:
"Ingest my payslips from ~/Documents/Buste"
The ingest_payslips tool will recursively scan the directory for .pdf files, parse each one, and store the data. Duplicates are automatically skipped via SHA-256 hashing.
Database location
All data is stored in a local SQLite database at:
~/.mcp-buste-paga/buste_paga.dbThe directory is created automatically on first run. The database contains four tables:
Table | Description |
| Company information (name, fiscal code, INPS/INAIL codes) |
| Employee profile (name, fiscal code, hire date, role, contract) |
| Monthly payslip summaries (gross, net, taxes, TFR, etc.) |
| Individual payslip line items (base pay, overtime, deductions, etc.) |
Available tools
Tool | Description |
| Scan a directory for PDF payslips, parse and store them. Returns a summary of ingested/skipped/failed files. |
| Get employee profile and company details, plus the number of payslips stored. |
| Get salary history (net pay, gross, deductions) ordered by most recent month. Optionally filter by year. |
| Get the full breakdown of a specific payslip by month and year, including all line items. |
| Search payslip line items by keyword (e.g. "Straordinario", "Ferie", "Ticket") with per-month and grand totals. |
Connecting to AI clients
Claude Desktop
Edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"buste-paga": {
"command": "/full/path/to/uv",
"args": [
"--directory",
"/full/path/to/MCP-Buste-Paga",
"run",
"mcp-buste-paga"
]
}
}
}Note: Use absolute paths. Find your
uvpath withwhich uv.
Restart Claude Desktop. A hammer icon in the chat input confirms the server is connected.
Claude Code (CLI)
Add to your project's .mcp.json or run:
claude mcp add buste-paga -- uv --directory /full/path/to/MCP-Buste-Paga run mcp-buste-pagaChatGPT Desktop
ChatGPT Desktop supports MCP servers via its settings. Go to Settings > Beta features > MCP Servers, click Add, and configure:
Name: buste-paga
Command:
/full/path/to/uvArguments:
--directory /full/path/to/MCP-Buste-Paga run mcp-buste-paga
Cursor
Add to .cursor/mcp.json in your project root:
{
"mcpServers": {
"buste-paga": {
"command": "/full/path/to/uv",
"args": [
"--directory",
"/full/path/to/MCP-Buste-Paga",
"run",
"mcp-buste-paga"
]
}
}
}Windsurf
Add to ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"buste-paga": {
"command": "/full/path/to/uv",
"args": [
"--directory",
"/full/path/to/MCP-Buste-Paga",
"run",
"mcp-buste-paga"
]
}
}
}Privacy
All payslip data is parsed and stored locally on your machine. No data is sent to external services. The AI client only accesses the data through the MCP tools above.
License
MIT
Available Tools
5 toolsget_employee_summaryA
Get employee and company information from the database.
Returns the employee profile (name, fiscal code, hire date, role) and company details, plus the number of payslips stored.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It transparently describes the return contents and implies a read-only database lookup via 'Get' and 'Returns.' However, it does not address potential permission requirements, data freshness, or any side effects; this is adequate for a simple summary getter but not especially rich.
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 extremely concise and front-loaded: two sentences, the first stating the main action and the second listing the returned data. Every sentence adds value and there is no redundancy.
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 zero-parameter read summary with an output schema present, the description covers the purpose and key return fields. It lacks explicit sibling differentiation and usage caveats, but given the low complexity and supporting output schema, it is reasonably complete.
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 accepts zero parameters, so there are no parameter semantics to clarify. The baseline of 4 applies because the schema has no parameter burden for the description to supplement.
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 the specific verb 'Get' with a clear resource: 'employee and company information from the database.' It enumerates exact return fields (name, fiscal code, hire date, role) and the number of payslips, which clearly distinguishes it from sibling tools focused on salary history, payslip details, or payslip search.
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?
There is no guidance about when to use this tool versus the sibling tools, no explicit alternatives, and no exclusions. The description is purely functional and does not help an agent decide between this and get_salary_history_tool, get_payslip_details_tool, or search_payslip_items.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_payslip_details_toolA
Get the full details of a specific payslip by month and year.
Args: mese: Month number (1-12). anno: Year (e.g. 2026).
Returns the payslip master record plus all line items (voci) showing what was paid or deducted (base pay, overtime, taxes, etc.).
| Name | Required | Description | Default |
|---|---|---|---|
| anno | Yes | ||
| mese | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the transparency burden. It discloses the return structure (master record plus line items with examples like base pay, overtime, taxes), which is useful. However, it omits any mention of side effects (though 'get' implies read-only), error behavior, or dependency on employee context. It adds some value but not full transparency.
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 concise and well-structured: a one-sentence purpose, an Args list, and a Returns summary. Every sentence earns its place with no redundant content.
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 (2 params, no nested objects) and has an output schema, so the description need not detail every return field. It provides an adequate summary of the return payload and clearly defines inputs. Minor gaps: it does not explain how the employee is determined or what happens if no payslip matches, but for this complexity, it is mostly complete.
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 0%, so the description must compensate. It fully does so: 'mese: Month number (1-12)' and 'anno: Year (e.g. 2026)' provide both meaning and format for the two parameters, which the schema only lists as integers with titles.
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 tool's function: 'Get the full details of a specific payslip by month and year.' It specifies the verb (Get), the resource (payslip), and the scope (specific, by month/year), which distinguishes it from siblings like get_employee_summary (aggregate) and search_payslip_items (search).
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?
No guidance is given on when to use this tool versus alternatives. It does not mention exclusions, preconditions, or sibling tools like search_payslip_items or get_salary_history_tool. The context signals include siblings, but the description itself provides no usage direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_salary_history_toolA
Get salary history ordered by most recent month first.
Args: year: Filter to a specific year (optional). limit: Maximum number of months to return (default 12).
Returns a JSON array with mese, anno, totale_competenze, totale_ritenute, netto_a_pagare, and lordo_anno for each month.
| Name | Required | Description | Default |
|---|---|---|---|
| year | No | ||
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of behavioral disclosure. It discloses ordering (most recent first), optional filters, and the exact list of returned fields, giving a transparent view of the tool's output and basic behavior. It doesn't discuss edge cases or error handling, but for a simple read-style query this is strong.
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 compact, front-loaded with the purpose, and every sentence adds meaningful information. The Args/Returns structure is standard and immediately parseable, with no wasted words.
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?
Even though an output schema exists, the description thoroughly covers the tool's behavior, parameters, ordering, and return shape. For a simple two-parameter retrieval tool, this is complete and leaves no major ambiguity.
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 has zero descriptions, so the description is the sole source of parameter meaning. It explains 'year' as an optional filter and 'limit' as the max months with default 12. This adds semantic value beyond the raw type/default fields in the 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 starts with a specific verb+resource: 'Get salary history' ordered by most recent month first. This clearly distinguishes the tool from siblings like get_payslip_details_tool or search_payslip_items, which focus on individual payslips or searching items.
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 establishes clear context (retrieving salary history by month) and mentions optional year filtering and limit, but does not explicitly compare with sibling tools or state when not to use it. This is 'clear context, no exclusions' per the rubric, so a 4 is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ingest_payslipsA
Scan a directory for PDF payslips, parse them, and store in the database.
Skips already-ingested files (SHA-256 deduplication). Returns a JSON summary: total files, ingested, duplicates skipped, failures.
| Name | Required | Description | Default |
|---|---|---|---|
| directory_path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the transparency burden. It discloses deduplication via SHA-256 and the return summary structure. However, it does not mention potential issues like invalid PDF handling or permission requirements, though the core write behavior is clear.
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 sentences, front-loaded with the main action, and includes essential behavioral details without any filler. Highly concise and well-structured.
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 simple one-parameter tool, the description covers the process, deduplication, and return summary. Since an output schema exists, return values are explained elsewhere. Minor gaps exist around error handling or file format specifics, but overall it is sufficiently complete.
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 description adds meaning by stating the parameter is the directory to scan for PDFs, which goes beyond the schema's raw title. However, it does not specify whether the scan is recursive, path constraints, or other details, so compensation is only partial.
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 tool scans a directory, parses PDF payslips, and stores them in the database. It uses specific verbs and resources and is distinct from sibling tools that are all query 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 purpose clearly implies when to use this tool (for ingesting payslips), but there is no explicit statement about when to use it vs alternatives. Sibling tool names suggest they are for querying, yet no alternatives are referenced directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_payslip_itemsA
Search payslip line items by description keyword.
Searches the voci_corpo_busta table using SQL LIKE matching. Groups and sums results by month/year.
Args: keyword: Search term (e.g. "Straordinario", "Ferie", "Ticket", "Commissioni"). start_year: Filter from this year (optional). end_year: Filter up to this year (optional).
Returns per-month breakdown and grand totals for competenze and ritenute.
| Name | Required | Description | Default |
|---|---|---|---|
| keyword | Yes | ||
| end_year | No | ||
| start_year | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses the SQL LIKE matching mechanism, the grouping/summation behavior, and the return format (per-month breakdown and grand totals), which is substantial behavioral detail. It does not discuss edge cases or explicit read-only status, but the search nature implies it.
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 well-structured: a one-line summary, a brief technical explanation, an Args list, and a return statement. Each sentence adds value with no redundancy. Front-loaded with the most important 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 tool with three simple parameters and an output schema, the description covers the search behavior, parameter semantics, and return shape. It omits minor edge cases (e.g., behavior with no results), but overall it provides sufficient context for correct invocation.
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 provides only type and default information, with zero semantic descriptions. The description's 'Args' section adds meaningful detail: keyword examples ('Straordinario', 'Ferie'), start_year as a 'from' filter, and end_year as an 'up to' filter. This fully compensates for the schema's lack of descriptions.
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 tool's function with a specific verb ('Search') and resource ('payslip line items by description keyword'). It also mentions the underlying table and matching method, distinguishing it from siblings like get_payslip_details_tool.
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 explains what the tool does (searches by keyword, groups by month/year) but does not explicitly state when to use it versus alternatives. No exclusions or comparison with sibling tools are mentioned, leaving usage guidance implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool targets a distinct operation: ingestion, employee profile, salary summary, payslip details, and keyword search. There is no apparent overlap; even the two 'get' tools serve clearly separate purposes (aggregate history vs. individual payslip detail).
Most names follow a verb_noun pattern, but two tools have the '_tool' suffix (get_salary_history_tool, get_payslip_details_tool) while others do not. This is a minor inconsistency that doesn't impede understanding, but it breaks the pattern slightly.
With exactly 5 tools, the set is well-scoped for a payslip management server. Each tool addresses a necessary step (ingestion, querying summaries, details, and search) without redundancy or bloat.
The server covers the core lifecycle: import payslips, view employee context, review salary history, inspect specific payslips, and search line items. Minor gaps exist (e.g., no list of all payslips as a lightweight endpoint, no update/delete), but the core functionality is complete for typical read-only and ingestion use cases.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Turn PDFs, scans and photos into a queryable database. Invoices, CVs, receipts, in bulk.
Turn any PDF into structured JSON via AI + OCR: invoices, bank statements, contracts.
Convert PDF bank statements into structured transactions, accounts, and balances.
Agent-native document parsing: PDF, scans and FR/EU invoices to structured JSON or Markdown.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceParse and query investment statements from multiple institutions (Questrade, Interactive Brokers, Scotia) using natural language or structured queries. Supports semantic search for dividends, holdings, transactions, and account balances with hybrid SQLite and vector database storage.
- FlicenseAqualityDmaintenanceParses PDF receipts to extract grocery and shopping expenses, automatically categorizes items using smart rules and LLM fallback, and stores them in a local SQLite database for querying purchase history and spending patterns.3
- AlicenseNot gradedqualityDmaintenanceEnables extraction of structured data from documents like invoices, receipts, and bank statements using local Vision AI (Ollama) or cloud providers (Gemini), with data stored in a local SQLite database.9MIT
- AlicenseNot gradedqualityCmaintenanceBuilds searchable SQLite databases from PDFs, preserving inline image locations for AI agents to discover and caption visual content. Supports full-text search over text, image placeholders, and saved captions.1MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/morettimarco/MCP-Buste-Paga'
If you have feedback or need assistance with the MCP directory API, please join our Discord server