About Pohoda MCP
Pohoda MCP connects AI clients to the Pohoda accounting software through its mServer XML API. It supports reading and creating records across documents, stock, and contacts, as well as printing or exporting records to PDF.
Key features
- 01Lists documents, stock, and contacts
- 02Creates invoices, orders, stock items, and contacts
- 03Prints records or exports them to PDF
- 04Sends XML through raw_xml
- 05Provides status checks and enum resources
Use cases
- 01Retrieve invoice and order records
- 02Create an invoice or order in Pohoda
- 03Check stock and contact details
- 04Print or export accounting records as PDF
MCP support
It exposes tools for querying, creating, printing, and sending raw XML, along with enum resources for MCP clients. The server communicates through Pohoda's mServer XML API.
Configuration
Local server config is the same for every client. Copy it into your client’s MCP config file.
We haven’t collected a package or remote endpoint for this server. Follow the instructions in the project README.
Tools
Local servers expose tools only once running on your machine, and the maintainer has not provided a tool list.
Details
From the project READMEPohoda MCP Server
MCP server pro účetní software Pohoda od Stormware. Komunikuje s Pohodou přes mServer XML API.
Propojte svého AI asistenta přímo s účetnictvím. Ptejte se na faktury, procházejte adresář, kontrolujte zásoby, vytvářejte nové doklady nebo si nechte vytisknout fakturu do PDF. Stačí napsat, co potřebujete, a MCP server se postará o komunikaci s Pohodou.
Požadavky
- PHP 8.1+
- ext-curl, ext-dom, ext-simplexml
- Pohoda s aktivním mServerem (schéma verze 2)
Nastavení mServeru v Pohodě
Před použitím MCP serveru je potřeba v Pohodě zapnout a nakonfigurovat mServer.
1. Otevření správy mServeru
V programu Pohoda otevřete agendu Účetní jednotky, v menu zvolte Databáze > POHODA mServer.

2. Správa konfigurací
Otevře se dialogové okno se seznamem konfigurací mServeru. Pro každou konfiguraci je uveden název, port, stav spuštění, host a PID.

3. Vytvoření nové instance
Klikněte na Nový a na záložce Základní nastavte:
- Název mServeru
- Účetní jednotku, se kterou bude mServer komunikovat
- Port pro komunikaci (výchozí 444)

Na záložce HTTPS lze zapnout zabezpečenou komunikaci:

Na záložce Monitoring lze zapnout logování komunikace:

4. Spuštění
Vyberte konfiguraci a klikněte na Spustit (nebo dvakrát klikněte na záznam). mServer začne naslouchat na nastaveném portu.
Alternativně lze mServer ovládat z příkazové řádky pomocí přepínače /HTTP
nad pohoda.exe. Jako poslední parametr se uvádí název konfigurace (v uvozovkách,
pokud obsahuje mezery):
& "C:\Program Files (x86)\STORMWARE\POHODA\Pohoda.exe" /HTTP start "eShop-1"
& "C:\Program Files (x86)\STORMWARE\POHODA\Pohoda.exe" /HTTP stop "eShop-1"
& "C:\Program Files (x86)\STORMWARE\POHODA\Pohoda.exe" /HTTP restart "eShop-1"
& "C:\Program Files (x86)\STORMWARE\POHODA\Pohoda.exe" /HTTP list
Další příkazy: stop /f (vynucené ukončení), list:xml (výpis konfigurací do XML).
Pro automatické spuštění při startu systému Stormware doporučuje Plánovač úloh
Windows (ne Windows službu).
Podrobnosti viz dokumentace Stormware.
Instalace MCP serveru
git clone https://github.com/dg/pohoda-mcp.git
cd pohoda-mcp
composer install
Konfigurace
Server se konfiguruje přes proměnné prostředí:
| Proměnná | Popis | Výchozí |
|---|---|---|
POHODA_URL | URL mServeru | http://localhost:444 |
POHODA_ICO | ICO účetní jednotky | |
POHODA_USERNAME | Uživatelské jméno pro mServer | |
POHODA_PASSWORD | Heslo | |
POHODA_EXE_PATH | Cesta k Pohoda.exe pro autostart mServeru (volitelné) | |
POHODA_CONFIG_NAME | Název konfigurace mServeru pro autostart (volitelné) |
Pokud jsou nastaveny POHODA_EXE_PATH a POHODA_CONFIG_NAME, server před prvním
tool callem ověří, že mServer běží — pokud ne, sám ho spustí přes pohoda.exe /HTTP start.
Při ukončení MCP serveru ho zase zastaví, ale jen pokud ho sám startoval (pokud
mServer už běžel, necháme ho běžet). Windows-only (mServer je součást Pohody).
Použití v agentech (např. Claude Code)
Hotová konfigurace je v souboru .mcp.json.example. Zkopírujte ho a doplňte
absolutní cestu k server.php a přístupové údaje. Poslední dvě proměnné jsou volitelné, slouží
k automatickému spuštění mServeru při prvním tool callu (viz výše). Kam soubor patří, záleží
na nástroji:
| Nástroj | Umístění |
|---|---|
| Claude Code | .mcp.json v kořeni projektu |
| Claude Desktop | obsah vložte do %APPDATA%\Claude\claude_desktop_config.json |
| Cursor | .cursor/mcp.json v projektu, nebo ~/.cursor/mcp.json pro všechny projekty |
| Gemini CLI | .gemini/settings.json v projektu, nebo ~/.gemini/settings.json |
| Windsurf | ~/.codeium/windsurf/mcp_config.json |
VS Code (Copilot) používá klíč servers a umí si heslo vyžádat při spuštění, takže nemusí
ležet v souboru. Do .vscode/mcp.json:
{
"inputs": [
{"type": "promptString", "id": "pohoda-password", "description": "Heslo k mServeru", "password": true}
],
"servers": {
"pohoda": {
"type": "stdio",
"command": "php",
"args": ["/cesta/k/pohoda-mcp/server.php"],
"env": {
"POHODA_URL": "http://localhost:444",
"POHODA_ICO": "12345678",
"POHODA_USERNAME": "Admin",
"POHODA_PASSWORD": "${input:pohoda-password}"
}
}
}
}
OpenAI Codex CLI má konfiguraci v TOML, do ~/.codex/config.toml:
[mcp_servers.pohoda]
command = "php"
args = ["/cesta/k/pohoda-mcp/server.php"]
env = { POHODA_URL = "http://localhost:444", POHODA_ICO = "12345678", POHODA_USERNAME = "Admin", POHODA_PASSWORD = "" }
Soubor s heslem nikdy necommitujte. Pokud konfiguraci ukládáte do projektu, přidejte ji
do .gitignore.
Dostupné nástroje
status
Ověří, jestli mServer běží a odpovídá. Základní volání vrací pouze stručný text
z GET /status (Pohoda odpovídá prostým stringem, ne XML). S parametrem
companyDetail=true navíc přes autentizovaný dotaz vrátí název účetní jednotky,
název databáze a aktuální účetní rok.
| Parametr | Popis |
|---|---|
companyDetail | true/false — vrátit i údaje o aktivní účetní jednotce (default false) |
list_documents, list_stock, list_contacts
Tři čtecí nástroje rozdělené podle druhu záznamu. Niche/číselníkové agendy
(centre, activity, store, bankAccount, cashRegister, numericalSeries)
nejsou dostupné přes dedikovaný tool, použij raw_xml.
list_documents
Doklady. Parametr agenda — jedna z následujících:
| Agenda | Popis | Agenda | Popis | |
|---|---|---|---|---|
invoice | faktury* | prijemka | příjemky | |
order | objednávky | vydejka | výdejky | |
voucher | pokladní doklady | prodejka | prodejky | |
bank | banka | prevodka | převodky | |
contract | zakázky | vyroba | výroba | |
intDoc | interní doklady | accountancy | účetní deník | |
offer | nabídky | |||
enquiry | poptávky |
* Agenda invoice vyžaduje parametr invoiceType: issuedInvoice nebo receivedInvoice.
Filtry: id, dateFrom, dateTill, company, ico, number
(přesná shoda celé hodnoty, ne substring), lastChanges
(záznamy změněné od YYYY-MM-DDThh:mm:ss), limit (default 100, klientský ořez).
list_stock
Zásoby. Filtry: id, code, name, ean, storage
(cesta ve členění skladu, např. "ZBOZI/Elektro"), store (zkratka skladu),
internet (true/false), lastChanges, limit.
list_contacts
Adresář. Filtry: id, company, ico, lastChanges, limit.
create_invoice
Vytvoření vydané nebo přijaté faktury. Podporuje:
- adresu partnera přímo nebo vazbu na adresář (
partnerId) - variabilní symbol, datum splatnosti, datum zdanitelného plnění
- předkontaci, způsob platby, bankovní účet
- středisko, činnost, zakázku
- cizí měnu s kurzem
- položky s vazbou na skladovou kartu (
stockCode)
create_address
Vytvoření záznamu v adresáři (firma/kontakt).
create_stock
Vytvoření skladové karty. Kromě základních údajů (kód, název, cena) podporuje:
- EAN, PLU pro pokladny
- příznaky pro prodej a e-shop
- popis, doplněk názvu, krátký název
- minimální a maximální zásobu, hmotnost
- dodavatele, záruku
create_order
Vytvoření přijaté nebo vydané objednávky s položkami.
Tisk nebo export do PDF libovolného záznamu. Umí:
- tisk na tiskárnu (výchozí nebo konkrétní)
- export do PDF souboru na serveru (
pdfPathje povinný pro PDF cestu) - vrácení PDF jako Base64 přímo v odpovědi (
pdfBase64=true, vyžadujepdfPath)
Agenda se zadává česky: vydane_faktury, prijate_faktury, zasoby, adresar,
pokladna, banka, interni_doklady, zakazky, vydejky, prijemky, prodejky,
vydane_objednavky, prijate_objednavky, vydane_nabidky, prijate_nabidky atd.
ID tiskové sestavy (reportId) se liší podle instalace a vlastních úprav.
V Pohodě ho zjistíte v Editoru tiskových sestav (menu Soubor → Tiskové sestavy),
kde u každé sestavy vidíte sloupec ID, nebo přes pravé tlačítko myši na sestavě
v dialogu tisku → Vlastnosti. Standardní dodávané sestavy mají ID v řádech
stovek až tisíců (typicky 200–3000+).
raw_xml
Odeslání libovolného XML. Pokrývá případy, na které ostatní nástroje nestačí.
XML se vloží přímo do <dat:dataPackItem> obálky, musí tedy obsahovat vlastní
namespace deklarace.
Referenční zdroje (MCP resources)
Číselníky povolených hodnot jsou vystavené jako MCP resources, takže si je klient může vyzvednout bez tool callu:
| URI | Obsah |
|---|---|
pohoda://enums/agendas | seznam agend rozdělený podle toho, který list tool je pokrývá |
pohoda://enums/vat-rates | povolené hodnoty vatRate u položek (none, low, high) |
pohoda://enums/payment-types | hodnoty paymentType faktur (draft, cash, card, compensation) |
pohoda://enums/print-agendas | české názvy agend přijímané print |
Použití z PHP kódu (bez MCP)
Knihovnu lze použít i přímo jako PHP klienta pro mServer, nezávisle na MCP. Hodí se pro vlastní skripty, cronjoby nebo integraci do existující aplikace.
use DG\Pohoda\PohodaClient;
$client = new PohodaClient(
url: 'http://localhost:444',
ico: '12345678',
username: 'Admin',
password: '',
);
// Najdi fakturu podle čísla dokladu
$list = $client->listRecords('invoice', ['number' => '26010192'], 'issuedInvoice');
$faId = (int) $list->items[0]->data['invoice'][0]['invoiceHeader']['id'];
// Vytiskni ji do PDF
$client->printRecord([
'agenda' => 'vydane_faktury',
'recordId' => $faId,
'reportId' => 3000,
'pdfPath' => 'C:\\tmp\\faktura.pdf',
]);
Veřejné metody PohodaClient: getStatus(), listRecords(), createInvoice(),
createAddress(), createStock(), createOrder(), printRecord(), sendRawXml().
Spouštění a zastavování mServeru
Pokud skript nemůže předpokládat, že je mServer už spuštěný, hodí se třída
MServerController. Je to tenký obal nad pohoda.exe /HTTP start|stop, který
spouští Pohodu non-blocking a po startu polluje PohodaClient::getStatus(),
dokud mServer nezačne odpovídat. Windows-only.
Nejjednodušší cesta je předat ho PohodaClientu — ten si pak sám lazy nastartuje
mServer před prvním HTTP requestem a při destrukci ho zase zastaví (jen pokud
ho sám startoval; pokud už běžel, necháme ho běžet):
use DG\Pohoda\MServerController;
use DG\Pohoda\PohodaClient;
$client = new PohodaClient(url: 'http://127.0.0.1:555', ico: '12345678', username: 'Admin', password: '');
$client->setController(new MServerController(
exePath: 'C:\Program Files (x86)\STORMWARE\POHODA\Pohoda.exe',
configName: 'mServer1',
));
// ... práce s $client — autostart se postará o sebe ...
Pokud chceš lifecycle řídit ručně, controller umí stejné věci přímo:
$ctrl = new MServerController(exePath: '...', configName: 'mServer1');
$wasRunning = false;
try {
$client->getStatus();
$wasRunning = true;
} catch (\RuntimeException) {
$ctrl->start($client); // vrátí se až když mServer odpovídá (nebo vyhodí po timeoutu)
}
// ... práce s $client ...
if (!$wasRunning) {
$ctrl->stop();
}
Při volání HTTP endpointů používej http://127.0.0.1:555, ne http://localhost:555
— PHP resolver zkouší pro localhost nejdřív IPv6 (::1), kam mServer nenaslouchá,
a čeká se zbytečně na timeout.
Veřejné metody MServerController:
start(PohodaClient $client, int $timeoutSeconds = 30)— spustí Pohodu s/HTTP start, čeká až HTTP status API odpoví. Při timeoutu vyhodíRuntimeException.stop()— pošle/HTTP stopfire-and-forget, nečeká na ukončení.
Řešení problémů
| Symptom | Pravděpodobná příčina |
|---|---|
Curl Error: Connection refused | mServer neběží; spusť ho v Pohodě nebo přes pohoda.exe /HTTP start |
HTTP 401 | Chybné POHODA_USERNAME / POHODA_PASSWORD |
| Odpověď je HTML s přihlašovací stránkou | Uživatel v Pohodě nemá práva na mServer nebo je agenda otevřená jinou instancí |
state="error" + note="Nepodařila se validace dokumentu podle schématu" | Špatná struktura XML — typicky zaměněný namespace nebo chybějící povinný element; text chyby ukazuje na element |
listRecords vrací prázdný seznam | mServer je připojený na jinou účetní jednotku/rok, než kde doklad žije (zkontroluj status s companyDetail=true) |
pdfPath je vytvořen, ale nejde otevřít (0 B) | mServer nemá práva zapisovat na dané místo — zkus výchozí D:\Data\ucto\Tisk\ nebo dočasný adresář uživatele, pod kterým Pohoda běží |
Print vrací OK, ale PDF nevzniká | reportId neexistuje v instalaci; ověř ID v Editoru tiskových sestav |
Struktura projektu
server.php vstupní bod MCP serveru (stdio transport)
.mcp.json.example vzorová konfigurace MCP klienta
src/
McpTools.php tenký MCP adaptér (#[McpTool] atributy)
PohodaClient.php HTTP klient a doménové metody pro mServer API
XmlBuilder.php stavba XML požadavků přes XMLWriter
Response.php parsovaná odpověď z mServeru
ResponseItem.php jeden záznam z odpovědi
MServerController.php spouštění a zastavování mServeru přes pohoda.exe
Licence
MIT
Comments
New to MCP?
From what the protocol is to installing your first server, these answers cover most first questions.
An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.