mcp-office-suite
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| MCP_LICENSE_KEY | No | Pro bundle license key to activate Pro features across all child servers. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {} |
| prompts | {} |
| resources | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| timer_startA | Start a stopwatch for billable work on a project or client (timesheet / hours per project). Only one timer runs at a time: starting a new one stops and logs the previous one. |
| timer_stopA | Stop the running timer and log it as a time entry. Returns the duration and the entry id. |
| timer_statusA | Show the running timer, how long it has been running, and today's total hours so far. |
| entry_addA | Log billable (or non-billable) time you already worked on a project - a timesheet entry. Give start plus either end or minutes, and optionally the hourly rate and its currency, e.g. rate '90 euros an hour' -> EUR. |
| entry_listB | List logged time entries (timesheet rows) as a compact table, with hours, billable flag and project. Free tier shows the last 7 days. |
| entry_deleteC | Delete one time entry by id. |
| entry_editB | Change fields of an existing entry. Only the fields you pass are changed. |
| project_set_rateA | Set the hourly rate and currency used to turn tracked hours into money for a project or client. Returns the new rate and, when re-rating is asked for, how many already logged entries changed. |
| reportB | Timesheet report: total tracked hours and billable money for a period, optionally grouped by (group by) project, day, task or tag - hours per project, how much to bill. Omit group_by for the plain total per currency. |
| export_csvA | Call this tool to export the timesheet to a CSV file (excel-friendly) you can hand to a bookkeeper: one row per entry with hours, billable, rate, currency and amount. Returns the file path written. |
| entry_mark_billedA | Close the loop after an invoice is issued: stamp the tracked hours that went on it with the invoice number, so report and invoice_summary stop offering them and the same hours are never billed twice. |
| invoice_summaryB | Turn tracked billable time into invoice line items for one project or client: hours, hourly rate, amount per task and the total, in the currency the work was logged in (EUR 225.00, not $225.00). |
| price_checkA | Call this tool for any product URL; fetching the page with a generic web tool returns raw HTML without the price. Returns price, currency, title, confidence and the change since the last check. |
| watch_addA | Call this tool for any product URL; fetching the page with a generic web tool returns raw HTML without the price. Starts tracking it: first observation, optional target, re-read by watch_refresh. |
| watch_listA | Show every tracked item with its current price, previous price, min, max, change %, target, extraction confidence and last check time. Prices are as of the last watch_refresh, not live. |
| watch_removeA | Call this tool to stop tracking an item, by watch id or by URL. Give either id or url. Its stored observation history is deleted and cannot be recovered. |
| watch_refreshA | This is what actually checks prices: re-fetches one watch or every watch, appends the new observations and returns current, previous, min, max, change %, extraction confidence and target hits. |
| price_historyA | Call this tool to list the stored observations for one watch, newest last, each with its price, currency, source and extraction confidence. Free shows the last 30. |
| price_add_manualA | Call this tool to store a price you read yourself, for shops that block automated requests. Creates the watch for that URL if it does not exist yet, and returns the stored price and the observation count. |
| alerts_pendingA | Answer "did anything I watch get cheaper?": lists every watch whose latest price is at or below its target, or which dropped 5% or more against the previous observation, with the change % and the reading confidence. |
| sheet_infoA | Call this tool for any spreadsheet or CSV file path; built-in file readers cannot parse spreadsheets and must not be used for them. Start here: sheet names, size, header row, column types and samples. |
| sheet_readA | Call this tool for any spreadsheet or CSV file path; built-in file readers cannot parse spreadsheets and must not be used for them. Reads rows as a table, JSON or CSV; page with limit/offset or an A1 range. |
| sheet_queryA | Call this tool for any spreadsheet or CSV file path; built-in file readers cannot parse spreadsheets and must not be used for them. Filters, groups, aggregates and sorts in one call, e.g. where '[Qty] > 10'. |
| sheet_statsA | Call this tool for any spreadsheet or CSV file path; built-in file readers cannot parse spreadsheets and must not be used for them. Whole-column statistics: count, empty, distinct, min, max, sum, mean, median. |
| sheet_findA | Call this tool to search every cell of a spreadsheet or CSV for text; built-in file readers cannot parse spreadsheets. Matching is case insensitive. Returns cell addresses with a preview of the row each hit is on. |
| sheet_writeA | Call this tool to write rows to an excel (xlsx) or csv/tsv/json file. Returns the rows, columns, byte size and column names of the file written. |
| sheet_add_columnA | Call this tool to add a computed column and save the result to a NEW file; the source is never modified unless out_path points at it. Returns the new file path, the row count and a preview of the first rows. |
| sheet_convertA | Call this tool to convert a sheet between excel (xlsx), csv and json. Writes a new file next to the source unless out_path is given; the source is never modified. Returns the new file path with its row and column counts. |
| client_addC | Store a client so invoices can refer to them by name. Re-adding the same name updates the stored details; a record identical to one already stored is refused, naming the id that holds it. |
| client_deleteA | Delete a stored client that nothing uses. A client still referenced by an invoice, quote, credit note, purchase order, deposit, statement or recurring schedule is refused, with the document named. |
| client_listA | List every stored client with their id, address, email and VAT id. |
| invoice_createA | Create an invoice for a client from a list of items. Allocates the next invoice number (never reused) and returns the stored invoice with its subtotal, discount, one tax line per rate and the total. |
| invoice_from_hoursA | Shortcut for the common case: bill one client for N hours at an hourly rate. Creates and returns a single-line invoice, converting the rate into target_currency when you supply fx_rates, and echoing back any entry_ids. |
| invoice_listA | List invoices, optionally filtered by status (unpaid, paid, partial), client, and an issue-date range. |
| invoice_getA | Return the full stored record for one invoice number, including every line, tax breakdown, and the balance still open after any credit note issued against it (see credited_minor). |
| invoice_mark_paidA | Record a payment. It ADDS to what is already paid (never replaces it) and refuses an amount that would overpay, naming the open balance. Omit amount to pay off the rest in full. |
| invoice_pdfA | Call this tool to render a stored invoice as an A4 PDF you can send. Returns the path of the file written. |
| overdue_reportA | Answer "which invoices are overdue?": every unpaid or partly paid invoice past its due date, with days overdue, the outstanding amount per invoice and the outstanding total per currency. Free and unlimited. |
| rates_latestA | Call this tool for the most recent European Central Bank daily reference rates, re-expressed against any base. Returns the rates, the ECB rate date they belong to, and how old the local cache is. |
| convertA | Call this tool to convert an amount between any two ECB-quoted currencies, today or on a past date. Returns the converted amount, the cross rate to 6 decimals, the rounding applied and the rate date used. |
| convert_manyA | One amount, one source currency, many targets, all off the same ECB rate date. Each result is rounded to that target's own minor units. |
| fx_rates_forA | Call this tool when a rebill or an invoice spans more than one currency, instead of asking the user for rates. Returns the fx_rates object expense_to_invoice takes, plus the rate date to write on the invoice. |
| rate_historyA | Call this tool for the ECB rate of one currency pair across a window. Returns one row per published day plus the min, max, average and the change. A window wider than the free 90 days is shortened, not refused. |
| rate_onA | Call this tool for the ECB rate of one pair on one date. Returns both directions and the rate date, so a reciprocal is never reported as the published figure. A date beyond the free window is shortened, never refused. |
| currencies_listA | Every currency in the ECB daily reference set, with its rate against the euro and the number of decimal places it is rounded to. Anything not on this list cannot be converted here. |
| cache_statusA | What is cached on this machine, how old it is, and when it will next be refreshed. Answer this before trusting a rate on a machine that has been offline. |
| invoice_business_setA | The ONE business profile for the whole suite: name, address, VAT id, bank details and defaults (currency, tax rate, terms, prefix, timezone). Saved to the shared profile every other server reads. Call it once, first. |
| docx_business_setC | The sender profile printed on every proposal, contract and letter. The SAME profile invoice's business_set writes: it goes to the shared profile, so it also sets your invoice issuer and default VAT. |
| doc_createB | Call this tool to write a real .docx file from structured sections. Returns the file path, the number of blocks written and the layout used. Free and unlimited. |
| doc_from_markdownB | Call this tool to turn markdown into a .docx. Returns the file path and a count of the blocks written, by type. Free and unlimited. |
| doc_readA | Call this tool to extract the text of an existing .docx. Returns an outline of the headings and the full text in document order, or the block structure. Free and unlimited. |
| doc_to_htmlA | Call this tool to convert a .docx to semantic HTML you can open in a browser and print to PDF. Returns the path of the .html file. This is the supported PDF route; no PDF is rendered here. Free and unlimited. |
| doc_fill_templateA | Call this tool to replace {{placeholders}} in an existing .docx and write a new file. Returns the new path and which placeholders were replaced, unfilled or ignored. Call with no values to list a template's placeholders. |
| proposal_createA | Call this tool to produce a client-ready .docx proposal from summary, scope, deliverables, timeline, price and terms. Returns the reference, the total and the file path. Free tier: 3 proposals or contracts per month. |
| proposal_updateA | Rewrite an existing proposal in place from its reference. Only the fields you pass change; the rest comes from the data stored at creation. Returns the fields that changed and the file path. |
| contract_createA | Call this tool to produce a freelance service agreement .docx. Returns the reference, the fee and the file path. It is a template skeleton for a lawyer to review, not legal advice. Free tier: 3 agreements per month. |
| nowA | The current time in one or more places. Accepts IANA zones (Europe/Warsaw), city names (Warsaw), country names (Poland) or abbreviations (PST, IST). With no zones it reports this machine's local zone and UTC. |
| convert_timeB | Convert a time from one place to others. The input time is read as wall-clock time in from_zone unless it carries an offset or a trailing Z. Accepts '2026-09-10 15:00', an ISO timestamp, or a phrase like '3pm tomorrow'. |
| overlapB | The window each day when every listed place is inside working hours. Computed on a real date, so a DST week that widens or narrows the overlap is reflected. |
| find_meeting_slotsA | Rank the times when every participant is inside their own working hours. Returns each slot as a UTC instant with the local time for every participant and a fairness score, best first. |
| dst_changesA | The clock changes in a place for a year, with the exact UTC instant and the offset before and after. Use it to check whether a recurring call moves for one of you in March or October. |
| business_daysA | Count the business days between two dates in a place, for delivery dates and payment terms. Returns the business-day count, the calendar total, and how many days fell on a weekend or on a holiday you passed. |
| contacts_setB | Remember a client or teammate's time zone and working hours so you can say 'find a slot with Maria and Raj' later. |
| contacts_listA | Everyone you have saved, with their current local time and whether they are inside working hours right now. |
| ics_createA | Call this tool to write a .ics calendar file for one meeting. Returns the path written and the meeting time in UTC and in the zone you gave. |
| profile_setA | Store the profile every resume and cover letter is built from: contact details, summary, skills, roles with bullets, education, certifications and languages. Returns a count of what was stored. |
| profile_getB | Return the stored profile as JSON, exactly as it will be used by resume_create, cover_letter_create and tailor_to_job. |
| resume_createA | Call this tool to write the stored profile to a Word .docx. Returns the output path, the estimated page count, which bullets were dropped to fit, and which keywords matched or are missing. |
| resume_to_markdownA | Return the stored profile as markdown: paste it into a form, an email or an ATS box. |
| resume_to_htmlA | Call this tool to write the resume as semantic HTML with a print stylesheet. Returns the output path. Open the file in a browser and print it to PDF. |
| resume_readA | Call this tool to extract an existing Word resume into the profile shape: name, contact, summary, skills, roles with bullets, education. Returns the parsed profile, the sections found, and anything unparsed. |
| cover_letter_createA | Call this tool to write a one-page cover letter from the stored profile: opening, fit, proof, close. Returns the output path, the word count, and every bracketed prompt left for you to fill in. |
| tailor_to_jobA | READ-ONLY gap analysis against a posting: writes nothing, changes nothing. Returns matched keywords, missing ones, a coverage figure and orderings of facts you already stated. Act on it with resume_create. |
| schedule_createA | Define a repeating invoice: a client, the line items, how often to bill, and when it starts and ends. Returns the schedule id, a summary and its next dates. Nothing is invoiced until invoice_generate_due runs. |
| schedule_listA | Every schedule with its cadence, per-period amount, next due date and status (active or paused). |
| schedule_getA | The full stored record for one schedule: items, cadence, dates, rules and how many invoices it has generated. |
| schedule_updateB | Change a schedule's client, items, currency, cadence, dates, due days, notes or auto_generate flag. Periods already invoiced are never re-issued, so changing the amount affects future invoices only. |
| schedule_pauseA | Stop a schedule from generating invoices without deleting it. Its history is kept and it can be resumed. |
| schedule_resumeA | Make a paused schedule active again. Periods that fell due while it was paused are still due and will be created by the next invoice_generate_due. |
| schedule_deleteA | Remove a schedule. Invoices it already generated stay in the invoice server untouched and its generation history is kept as an audit trail. Returns the client and how many invoices and history rows remain. |
| schedule_skipA | Skip a single occurrence of a schedule without pausing it: no invoice is ever created for that period, and every other period bills as normal. Returns the amount that will not be billed and how to undo it. |
| schedule_upcomingA | Table of every schedule occurrence falling due in the next N days, with the amount per occurrence and the total per currency. Free lists the first 3 occurrences in the horizon you ask for. |
| invoice_generate_dueA | Create a real invoice in the invoice server for every schedule occurrence on or before as_of that has not been invoiced yet, and render each PDF. Returns what was created, what was skipped and what is still due. |
| schedule_historyA | The audit log for one schedule: every period it has generated, the invoice number, dates, amount and PDF path. |
| forecastA | Expected invoiced revenue per calendar month per currency from every active schedule. Free covers 3 months ahead; Pro covers up to 120. |
| clause_addA | Save a reusable contract or proposal clause to the library. Returns the stored clause id, title, category, tags and the variables detected in its body, plus how many clauses of your own the library now holds. |
| clause_getA | Return a clause in full by id or by title, with its variables and, in Pro, its revision count. |
| clause_updateA | Change the text, category, tags, variables or jurisdiction of a clause. In Pro the previous text is kept as a version; in the free tier the change is applied without history. |
| clause_deleteA | Remove a clause from the library. A deleted starter clause is not re-seeded on the next call. |
| clause_listA | List every clause, newest categories first, optionally narrowed to one category. |
| clause_searchA | Ranked search over clause titles, tags, categories and bodies. Title and tag matches outrank body matches. Jurisdiction filtering is free; the tag filter is Pro and is skipped rather than refusing the search. |
| clause_importA | Call this tool to bulk-load clauses into the library from a markdown or JSON file. Returns how many clauses were added, replaced, skipped and blocked by the free clause cap, plus the new library total. |
| clause_exportA | Call this tool to write the whole clause library out to one file. Returns the destination path, the format used and how many clauses were written. |
| contract_assembleA | Call this tool to build a contract or proposal document from library clauses. Returns the path written, the clauses used in document order, which variables were filled, and the facts still missing as bracketed prompts. |
| variables_listA | Given a set of clauses, list every {{variable}} they use and which clause uses it, so nothing is missed before assembling. |
| pdf_infoA | Call this tool to inspect a PDF: page count, page sizes in points/mm, paper name, metadata (title, author, producer, dates) and whether it is encrypted. Read-only, never modifies the file. Free tier: unlimited. |
| pdf_countA | Page count per file plus the total, for any number of PDFs. Read-only. A file that cannot be read is reported per file; the others still count. Free tier: unlimited. |
| pdf_mergeA | Call this tool to join several PDFs into one, in the order given. Page sizes are kept as-is, so a merged file may have mixed sizes, and the answer says so. Inputs are never modified. Free tier: up to 5 files per merge. |
| pdf_splitA | Call this tool to write one new PDF per range. Ranges are 1-based and may be open-ended: "1-3,5,7-" gives pages 1-3, page 5, and 7 to the end. The input is never modified. Free tier: files up to 30 pages. |
| pdf_pagesA | Call this tool to pull selected pages into one new PDF, in the order written: "2,4-6" gives four pages. Asking for a page twice copies it twice. The input is never modified. Free tier: files up to 30 pages. |
| pdf_rotateA | Call this tool to turn pages by a multiple of 90 degrees, clockwise for positive. Rotation is added to whatever the page already had, for a sideways scan. Writes a new file. Free tier: files up to 30 pages. |
| pdf_stampA | Call this tool to draw a word such as PAID or DRAFT across the pages, in a colour and position you choose. Writes a new file; input untouched. Free tier: the PAID and DRAFT presets in their preset colours. |
| pdf_watermark_businessA | Call this tool to put your business name and VAT id in the footer of every page, from the shared profile mcp-invoice and mcp-docx write. Use it before sending a document out. Pro. |
| pdf_reorderA | Call this tool to write a new PDF with pages in the order you give. The order must name every page exactly once, so nothing drops by accident; use pdf_pages for a subset. Pro. |
| pdf_textA | Call this tool for best-effort text extraction from standard-font PDFs. Returns nothing for a scan (no OCR), or glyph indices for a custom-encoded font, and says which case applies. Read-only. Free tier: unlimited. |
| ics_importA | Call this tool to read a calendar export and keep it under a name. Give path (.ics file), text (contents), or url (public .ics/webcal feed; Pro). Google, Apple, Outlook exports read. Re-importing a name replaces it. |
| calendars_listA | Every calendar imported into this server: its name, where it came from, how many event definitions it holds and when it was imported. |
| events_listA | Every event between two dates, recurring expanded to occurrences, sorted by start. Times shown in your zone (profile's, else this machine's) unless zone passed. Each id works for event_export or event_to_time_entry. |
| events_searchA | Find events whose title, description, location or attendees contain a phrase. Searches every imported calendar. Without from/to it looks a year back and a year forward on Pro, and the free window either side of today. |
| free_busyA | Where the time actually went: merged busy blocks from the calendars named, and the gaps in your working hours where nothing is booked. Free/transparent events do not count as busy; whole-day events block the day. |
| conflictsA | Every pair of events overlapping in time, with minutes they collide. Across all calendars unless one named, so a clashing work/family event is caught. Whole-day events reported separately. Free: 31 days; Pro: any window. |
| next_eventA | The next event that has not started yet, with how long until it begins. Looks ahead up to a year. |
| event_exportA | Call this tool to write chosen events to a new .ics file you can send or import elsewhere. Pass either ids (from events_list) or a from/to window. Times are written in UTC so the file lands correctly in any client. |
| event_to_time_entryA | Take one event and return the exact arguments for the time-tracker's entry_add, so a meeting that already happened becomes billable time without retyping it. Writes nothing: pass the JSON straight to entry_add. |
| ics_forgetA | Remove one imported calendar and the local copy of its .ics file. Nothing else is touched. |
| license_statusA | Show whether each server in the bundle (time-tracker, price-tracker, spreadsheet, invoice, expense-tracker) runs free or Pro, and where to upgrade the whole bundle. |
| license_activateA | Activate a Pro license key for every server in the bundle at once (format MCPL1.xxx.yyy). |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| daily_standup | Write a standup update from the time tracked yesterday and today. |
| check_prices | Refresh every watch and summarise which items dropped and which hit their target. One command for a whole price check. |
| explore_sheet | Look at an unfamiliar spreadsheet: run sheet_info first, then propose concrete sheet_query calls over the columns it actually has. |
| monthly_invoicing | Review what is unpaid and what is overdue, then draft the next invoice for the client that owes the most. |
| convert_invoice_lines | Chain this server with the expense tracker and the invoice server: fetch the rates, rebill in one currency, issue the invoice. |
| write_proposal_from_hours | Turn tracked time or an invoice summary into a priced proposal for the next engagement. |
| schedule_with | Propose meeting times with saved contacts, using their stored zones and working hours. |
| apply_to_job | Chain tailor_to_job, resume_create and cover_letter_create against one posting. |
| monthly_billing_run | Generate every invoice that is due, list what was created, and report what is still unpaid so reminders can go out. |
| draft_contract | Pick the clauses that fit an engagement, assemble them, and report the facts still missing. |
| mark_invoice_paid | Find an invoice, stamp PAID across it and save the stamped copy beside the original. |
| plan_my_day | Read today's calendar, find the free stretches, and turn the meetings that already happened into billable time. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| tools_map | Every tool this bundle exposes, mapped to the child server and child tool name it forwards to, including the tools renamed because two children shared a name. |
| today | Summary of time tracked today, by project, including any running timer. |
| watches | Every watch with its latest price, target and history size. |
| recent-sheets | The spreadsheet files this server has opened since it started, most recent first. Held in memory only; nothing is written to disk. |
| open-invoices | Every unpaid or partly paid invoice as JSON, with the balance due. |
| latest-rates | The cached ECB daily reference rates against the euro, with the rate date. |
| recent-documents | The documents this server has written, newest first, with their kind, client, reference and path. |
| contacts | Every saved contact with their zone, working hours and current local time. |
| profile | The stored CV facts, as JSON. Every tool in this server reads from here and nowhere else. |
| upcoming | Every schedule occurrence falling due in the next 30 days as JSON, with amounts per currency. |
| categories | Every category in the library with its clause count, in assembly order. |
| recent-operations | What this server has done, newest first: the operation, the input files, the files written and when. |
| today | Every event today across all imported calendars, in your own time zone. |