Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
제작자가 쓴 설명(영어 원문)
Issue and track a Romanian company's invoices on Oblio, with totals computed as ANAF checks them.
이 세 가지는 절대 하나의 점수로 합치지 않아요. 의견, 측정, 인기는 서로 다른 것이니까요.
이 서버는 아직 쉬운 말로 된 요약을 쓰지 못했어요. 아래는 레지스트리에서 읽어 온 사실이에요.
쓰고 있는 AI 앱을 고른 다음 설정을 복사하세요.
OBLIO_CONFIG필요한 것
어떤 앱을 쓰세요?
위에서 앱을 고르세요. 기억해 두었다가 다음부터는 버튼에 “…에 설치”라고 표시해요.
Claude Desktop → Settings → Developer → Edit Config를 열고 claude_desktop_config.json에 이 내용을 붙여 넣으세요
{
"mcpServers": {
"oblio": {
"command": "npx",
"args": [
"-y",
"@foreverworks/mcp-oblio"
],
"env": {
"OBLIO_CONFIG": "your-value"
}
}
}
}터미널에서 이 명령어를 실행하세요
claude mcp add oblio --env OBLIO_CONFIG=your-value -- npx -y @foreverworks/mcp-oblio실행하기 전에 빈 값을 채워 주세요.
프로젝트의 .cursor/mcp.json 또는 ~/.cursor/mcp.json에 붙여 넣으세요
{
"mcpServers": {
"oblio": {
"command": "npx",
"args": [
"-y",
"@foreverworks/mcp-oblio"
],
"env": {
"OBLIO_CONFIG": "your-value"
}
}
}
}브라우저가 앱을 열지 물어본 다음, 앱이 설정을 보여 주고 확인을 요청해요. 키 값은 비워 두니 직접 입력하세요.
프로젝트의 .vscode/mcp.json에 붙여 넣으세요
{
"servers": {
"oblio": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@foreverworks/mcp-oblio"
],
"env": {
"OBLIO_CONFIG": "your-value"
}
}
}
}브라우저가 앱을 열지 물어본 다음, 앱이 설정을 보여 주고 확인을 요청해요. 키 값은 비워 두니 직접 입력하세요.
이 서버는 내 컴퓨터에서 실행되는데, ChatGPT는 인터넷에 있는 서버에만 연결할 수 있어요. 다른 앱을 고르세요.
선택한 앱은 이 기기의 쿠키에만 저장돼요. 계정은 필요 없어요.
이 설정은 제작자의 레지스트리 정보로 만들었어요. README와 다르면 README를 따르세요.
내 컴퓨터에서 실행돼요. 설치하면 AI 앱에 도구 목록이 나타나요.
누구나 볼 수 있는 정보를 점검했고, 코드는 읽지 않았어요. 해당하지 않는 항목은 개수에서 뺐어요. · 2026년 11월 7일 점검
레지스트리 이름이 도메인 foreverworks.com 기준으로 확인되었어요(레지스트리가 도메인 소유를 확인해요)
아직 GitHub에서 이 저장소를 읽어 오지 않았어요
아직 GitHub에서 이 저장소를 읽어 오지 않았어요
내 컴퓨터에서 실행되는 서버라 인터넷 엔드포인트가 없어요
내 컴퓨터에서 실행되며, 대신 로컬 설정을 사용해요
내 컴퓨터에서 실행돼요. 도구 목록은 인터넷 엔드포인트가 있는 서버에서만 읽을 수 있어요
레지스트리에서 이 카테고리의 활성 서버 전체와 비교했어요. 스타는 게시자가 저장소를 소유한 경우에만 세요.
해당하는 기본 점검 1개 중 1개를 통과했어요. 코드는 읽지 않았어요. 키나 토큰을 넣기 전에 서버가 어떤 권한을 요구하는지 확인하고, 꼭 필요한 권한만 있는 키를 쓰세요.
입력해야 할 값: OBLIO_CONFIG
내 컴퓨터에서 실행돼요. AI 앱이 필요할 때 실행하고, 데이터는 제작자의 서버를 거치지 않아요(서버 자체가 온라인 서비스를 호출하는 경우는 제외).
GitHub 저장소는 마지막으로 – 변경됐고, 최신 버전(0.1.1)은 6일 전 레지스트리에 올라왔어요.
Claude Desktop, Claude Code, Cursor, VS Code처럼 MCP를 지원하는 앱에서 쓸 수 있어요. 내 컴퓨터에 Node.js도 있어야 해요.
같은 카테고리에는: Spec Driven Development, Remote Desktop Commander, sync. labs
같은 카테고리에서 다른 제작자가 만든 서버예요. 스타 순으로 정렬했어요.
카드 보는 법:★ GitHub 스타i세 기둥: 리뷰 · 점검 · 사용 정도i업데이트 = 최신 버전을 레지스트리에 공개한 날i
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
Lipsync videos, dub them into other languages, make talking videos and open sync. Studio.
제작자의 저장소에서 쓰인 그대로 가져왔어요. PopNx MCP가 검토하거나 보증한 내용이 아니에요. HTML, 이미지, 스크립트는 제거했어요. 링크를 누르면 이 사이트를 벗어나요.
Issue and track a Romanian company's invoices from your AI assistant, through Oblio's API. It reads clients, products, series, VAT rates and issued invoices; it issues invoices and proformas, records payments, and cancels, restores, reverses or deletes invoices. Every tool that makes, changes or unmakes a fiscal document is money: your client asks you first, and shows the total computed the way ANAF checks it.
You need an Oblio account, its API secret, and the tax id (CIF) of the company the server should act on. There is no sandbox: an invoice issued here is real and takes the next number in its series.
With Claude Code:
claude mcp add oblio -e OBLIO_CONFIG="<path to Oblio app.json>" -- npx -y @foreverworks/mcp-oblio
Claude Desktop (Settings, Developer, Edit Config) and most other clients read the same command as JSON:
{
"mcpServers": { "oblio": { "command": "npx", "args": ["-y", "@foreverworks/mcp-oblio"], "env": { "OBLIO_CONFIG": " " } } } }
Each runs the published package on Node 22.19 or newer. VS Code and the Claude Desktop bundle ask for OBLIO_CONFIG as they add the server. Cursor reads it from your environment instead (${env:OBLIO_CONFIG}), so set it before you start Cursor. Configuration says what it holds.
git clone https://github.com/foreverworks/mcps.git && cd mcps
npm ci && npm run build claude mcp add oblio -e OBLIO_CONFIG=" " -- node "$PWD/servers/oblio/dist/index.js"
In a JSON configuration, the command is node and its one argument the full path of servers/oblio/dist/index.js. To share one running copy between several clients over HTTP, see docs/deploying.md.
| Variable | Required | Meaning |
|---|---|---|
OBLIO_CONFIG | yes | Path of app.json (below), which the server only reads. Under systemd, when this is unset, app.json in CREDENTIALS_DIRECTORY (LoadCredential=app.json: ) is used. |
OBLIO_STATE_DIR | no | Where the access-token cache goes; the default is in docs/configuration.md. |
app.json holds three values, all required:
{
"client_id": " ", "client_secret": " ", "company_cif": " " }
company_cif has no default, so no call can act on a company nobody named. api_base and token_url override Oblio's endpoints, for tests or a proxy. The server never writes app.json, and its errors name a bad field, never a value.
app.json as client_secret, with the email you signed in with as client_id.Oblio makes a new secret every time the account's password is reset, so after a reset app.json needs the new one.
The state folder holds access_token.json, the hour-long token Oblio issues for the secret, written with mode 0600 and locked across processes. The variables every server shares (transport, limits, confirmation) are in docs/configuration.md.
health check. It answers with the account, the company CIF from app.json, and whether the account reaches that company. A refused secret shows up here, before anything is issued.list_series) and VAT rates (list_vat_rates): an invoice names its series and each line's rate by the names Oblio gives them.From a shell, node dist/index.js --health prints one OBLIO: line and exits non-zero when the credentials do not work, which suits a timer.
read changes nothing; write changes something in your Oblio account; money makes, changes or unmakes a fiscal document, and your client asks you before each call.
| Tool | Access | What it does |
|---|---|---|
health | read | Whether the server is up, as which account, on which company CIF, and whether the account reaches that CIF. Always asks Oblio. |
list_companies | read | The companies the account is attached to. Cached 10 minutes. |
list_clients | read | Saved clients, filtered by name or CIF, a page at a time. Never cached. |
list_products | read | Saved products and services, filtered by name or code, a page at a time. Never cached. |
list_series | read | The document series and the number each one issues next. Cached 10 minutes, and forgotten after any issue or delete. |
list_vat_rates | read | The VAT rates a line's vat_name and vat_percentage come from. Cached 10 minutes. |
list_invoices | read | Issued invoices by period, series, buyer, status (unpaid, paid, cancelled) and e-Factura state, newest first, a page at a time. |
get_invoice / get_proforma | read | One document by series and number: its PDF and e-Factura links, its total and its payments. |
create_proforma | write | Issues a proforma. It is not a fiscal document, but it takes a number in its series. |
create_invoice | money | Issues an invoice. |
invoice_from_proforma | money | Issues an invoice that references a proforma, with the proforma's client, lines and total. |
collect_invoice | money | Records a payment received against an issued invoice: how, how much, when, and its reference. |
cancel_invoice / restore_invoice | money | Cancels an invoice (its number stays used), or undoes that. |
reverse_invoice | money | Issues the reversing invoice (storno) for an issued one, its total exactly the original's, negated. |
delete_invoice | money | Removes an invoice for good. Oblio allows it only for the last number in a series. |
The seven money tools are marked so in tools/list, and your client asks you to approve each call (Claude Code does, in every permission mode). With MCP_CONFIRM=elicit the server asks you itself instead, in one line computed from the arguments. For example:
Issue invoice in series FCT to Client SRL (CIF RO87654329): 9680.00 RON incl. VAT 1680.00 (1 line), dated 2026-09-28, due 2026-10-28, marked paid by Ordin de plata OP 7001
Record 1000.00 EUR paid on invoice FCT 0042 to Client SRL, Ordin de plata OP 7001, 2026-10-02, leaving 210.00 EUR unpaid Issue a reversing invoice for FCT 0042, Client SRL, total -9680.00 RON, in series FCT, keeping the payment recorded on it DELETE invoice FCT 0042 totalling 9680.00 permanently (no undo; only the last number in a series can be deleted, and anything already sent to ANAF stays there)
The first line is the document in Document input, below. The last is delete_invoice given expect_total; without it the line says "total not given, so not checked". The server puts its name first, so you read oblio: Issue invoice ....
What you approve is what is issued:
documentTotal (the kit's invoiceTotals.ts), the same function whose result create_invoice returns as computedTotal. After issuing, the document is read back, and if Oblio's total differs the call fails with reason: "total_mismatch", naming the document that was issued. invoice_from_proforma reads the proforma first and holds the invoice to its total.expect_total, a number that names an invoice of another total changes nothing. (Oblio's document read carries no buyer, so the buyer cannot be checked the same way.)`auth`: "Oblio refused the client_id and secret". The secret changed, usually after a password reset. Copy the new one from Settings, Account Data into app.json.
`api` with `reason: "outcome_unknown"` after an issue or a delete. The connection dropped, so nobody knows whether Oblio acted. Look the document up first (get_invoice, or Oblio's web app). If it is not there, call again with the idempotency_key the error reported: Oblio will not issue the same key twice. A repeated collect_invoice is safe as it is: it finds the payment if it landed and records nothing.
`api` with `reason: "total_mismatch"`. The document was issued, but Oblio's total is not the one you confirmed. Open it (get_invoice or get_proforma) and cancel it if it is wrong; do not issue it again.
`api` with Oblio's own message, such as "Seria FCT nu exista". The message names the field or series at fault; list_series and list_vat_rates give the names Oblio expects.
`api` with status 401 or 403 on a call. The account cannot act on the company in company_cif; health and list_companies show which companies it reaches.
`api` with `reason: "drift"`. Oblio's answer changed shape. The server refuses to guess; please report it.
create_invoice and create_proforma take the document as a validated input modelled on Oblio's "Parametri document" table, in snake_case. The company's CIF is not part of it: it comes from app.json, so no pasted example can issue against another company.
{
"client": { "name": "Client SRL", "cif": "RO87654329", "vat_payer": true }, "series_name": "FCT", "issue_date": "2026-09-28", "due_date": "2026-10-28", "currency": "RON", "products": [ { "name": "Consulting", "price": "1000.00", "quantity": "8", "measuring_unit": "ora", "vat_name": "Normala", "vat_percentage": "21", "vat_included": false, "product_type": "Serviciu" } ], "collect": { "type": "Ordin de plata", "document_number": "OP 7001" } }
"1000.00"), checked by a pattern and sent to Oblio as that string, so it never passes through a floating-point number. The arithmetic is the kit's exact decimal.ts.앞부분만 보여 드려요. 나머지는 저장소에서 읽어 보세요