From origo-bc
This skill should be used when the user mentions Business Central, BC, Dynamics 365, Origo BC, the MCP server at dynamics.is, skills or prompts stored in BC, `get_config`, `set_config`, UBL templates, or asks about the `/origo-bc-*` commands. Loads the Origo BC operating rules that govern how Claude reads and writes skills, prompts and UBL templates in the BC MCP-Skills, MCP-Prompts and UBL Templates namespaces, and which connection formats are accepted by the server.
How this skill is triggered — by the user, by Claude, or both
Slash command
/origo-bc:origo-bc-accountingThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Follow these rules whenever the user is working with the Origo BC MCP
Follow these rules whenever the user is working with the Origo BC MCP
endpoint (https://dynamics.is/api/mcp), skills, prompts, UBL templates or
the /origo-bc-* commands.
get_bc_accounting_rulesThis skill is a compact starter set. The MCP server hosts a comprehensive
version of the Origo BC accounting and development rules at
https://origopublic.blob.core.windows.net/resources/mcp/CLAUDE.online.md.
When this skill loads, call get_bc_accounting_rules on the MCP server to
fetch the full rules. The tool supports three retrieval modes:
| Call | What you get |
|---|---|
get_bc_accounting_rules() | Frontmatter, intro, and a heading-only table of contents (small payload — start here). |
get_bc_accounting_rules({ section: "AL Naming Conventions" }) | A single section by heading text (case-insensitive, substring match). |
get_bc_accounting_rules({ full: true }) | The entire document — use only when the full context is truly needed. |
The tool caches the document for 5 minutes. Pass { refresh: true } to
bypass the cache.
Recommended flow:
{ full: true } when a broad review or cross-cutting task
needs the complete document.When running inside Cowork chat or Claude.ai (not VS Code / Claude Code):
get_config and set_config to read and write skills and
prompts.check_standards_status, update_bc_standards, or
setup_origo_bc_environment — those tools are for VS Code's developer
environment only.MCP-Skills records.MCP-Prompts records.| Source | Role | Content |
|---|---|---|
MCP-Skills | Knowledge / lookup text | JSON with patterns, rules, reference data |
MCP-Prompts | Triggers / workflows | Markdown body + frontmatter + variables |
Both namespaces use the same index pattern: the record at GUID
00000000-0000-0000-0000-000000000000 is the index of every record in that
namespace.
Fetch the index only when the user asks about BC, skills, or a BC-adjacent task — never automatically at the start of every conversation.
get_config(source: "MCP-Skills", id: "00000000-0000-0000-0000-000000000000")
get_config(source: "MCP-Skills", id: "<guid>")
data is the full record body — use it as source material for the relevant
slice of work.
type | Where is the content? | How to load |
|---|---|---|
content | Inline in the record's data field | Read data directly |
remote-loader | Metadata + sourceUrl only; body is on the web | Fetch sourceUrl via WebFetch and treat the response as source |
For a remote-loader skill: fetch the record, then fetch sourceUrl, then
use the downloaded content as the authoritative body.
Prompts are slash-command templates that reference one or more skills via
skillRefs.
get_config(source: "MCP-Prompts", id: "00000000-0000-0000-0000-000000000000")
get_config(source: "MCP-Prompts", id: "<guid>")
Prompt record shape:
{
"name": "<prompt-name>",
"description": "<what it does>",
"frontmatter": { "mode": "agent", "tools": [] },
"variables": [ { "name": "foo", "type": "input", "description": "" } ],
"skillRefs": ["<skill-guid-1>", "<skill-guid-2>"],
"body": "<markdown with ${input:variable} placeholders>"
}
When a user's request matches a prompt: fetch that prompt, fetch every
referenced skill, then execute the body.
The server's resolveConn accepts two formats for encryptedConn (whether
the blob arrives as the x-encrypted-conn header or as a tool argument):
plain:<base64> (preferred for new installs)Base64-encoded JSON {tenantId, clientId, clientSecret, environment}. No
HTTPS setup round-trip, no MCP_ENCRYPTION_KEY required server-side.
How to build the blob:
.\Create-PlainConnectionString.ps1 -TenantId ... -ClientId ... -Environment ...
→ returns dpapi:<base64> (the plain: payload DPAPI-wrapped to the
current Windows user/machine).node create-connection-string.js --tenant ... --client ... --environment ...
→ returns plain:<base64> with no DPAPI wrap; protect the config file
with chmod 600 or a platform secret manager.Protection in practice:
Calls encrypt_data on the server with plaintext JSON → receives base64
ciphertext → DPAPI-wraps locally on Windows.
Use only for environments that already have configured dpapi:<...> blobs
containing AES ciphertext, or when the user explicitly requests a second
encryption layer.
| Situation | Choice |
|---|---|
| New install on Windows | A (plain: + DPAPI) |
| New install on macOS / Linux | A (plain: + chmod) |
| Existing working config | B — leave it alone |
| Server without encryption key | A |
The stdio-proxy.js bridge is format-agnostic — it forwards whatever string
it has in x-encrypted-conn. The server branches on the prefix (plain:
decodes base64, otherwise AES-decrypts).
If you discover a new pattern, a known bug, a workaround, or a confirmation that something works (or doesn't), write it into the relevant skill record immediately so it persists across sessions.
set_config(source: "MCP-Skills", id: "<guid>", data: { ...updated body... })
AXXXXXXX-0000-0000-0000-XXXXXXXXXXXX:
A1xxxxxx — bc-general/* (content)A2xxxxxx — bc-journal-corrections/* (content)A3xxxxxx — bc-incoming-document/* (content)A9xxxxxx — top-level orchestration skills (content)type: content (store in BC) or remote-loader (store metadata + URL).set_config(source: "MCP-Skills", ...).type, description, and
trigger conditions.set_config(source: "MCP-Skills", id: "00000000-0000-0000-0000-000000000000", data: { ...index with new entry... })
BXXXXXXX-0000-0000-0000-XXXXXXXXXXXX:
B9xxxxxx — top-level orchestration prompts (pairs with A9 skills).P is not valid hex.set_config(source: "MCP-Prompts", ...).skillRefs, and trigger conditions.Always update the index when:
Icelandic PEPPOL UBL XML templates live in Cloud Events Storage under
source = "UBL Templates". Whenever Claude is producing PEPPOL UBL XML
(invoice, credit note, order, etc.), fetch a template first. Never
write UBL XML from scratch; the templates enforce correct namespace
declarations, PEPPOL CustomizationID / ProfileID, and Iceland-specific
defaults.
get_config(source: "UBL Templates", id: "DDDD0000-0000-0000-0000-000000000000")
get_config(source: "UBL Templates", id: "<guid-from-index>")
Three standards are supported:
| Standard | UBL version | Use |
|---|---|---|
| PEPPOL BIS 3.0 | 2.1 | Current standard — use by default |
| PEPPOL BIS 2.0 | 2.1 | Transition standard (~2017–2021) |
| IS e-reikningur BII1 | 2.0 | Original Icelandic electronic invoice (legacy systems) |
Identify the right standard from CustomizationID and ProfileID on the
source document.
Template use:
{{placeholder|default}} with the real value (use
default if nothing is available).InvoiceLine, CreditNoteLine, etc.) once per line.EndpointID.| GLN value | EndpointID | schemeID (BIS 3.0) | schemeID (BIS 2.0) | schemeID (BII1) |
|---|---|---|---|---|
| 10 digits | GLN (= kennitala) | 0196 | 9917 | IS:KT |
| 13 characters | GLN (international GS1) | 0088 | 0088 | 0088 |
| Empty | Registration No. (kennitala) | 0196 | 9917 | IS:KT |
0088 = GS1 GLN scheme. 0196 = Icelandic national registry (BIS 3.0).
9917 = kennitala EAS code (BIS 2.0). IS:KT = kennitala (BII1).
Files under C:\Data\MCP\prompts\*.prompt.md are mirrors of BC prompt
records — VS Code / Claude Code reads them as slash commands. They are
not the source of truth; if a mirror drifts from BC, rebuild it from
the BC record.
Skills and prompts in BC are the one source of truth. Local files only describe how to fetch them — they don't store the content.
Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub businesscentralal/origo-bc-plugin --plugin origo-bc