Polarion MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| POLARION_URL | Yes | Base URL of your Polarion instance | |
| POLARION_TOKEN | Yes | Personal Access Token for authentication | |
| POLARION_VERIFY_SSL | No | Verify TLS certificates (default true). Set false for self-signed certs on trusted networks. | true |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| logging | {} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| extensions | {
"io.modelcontextprotocol/ui": {}
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_document_commentsA | List a document's comments as a flat page. Threads reconstruct via parent_comment_id (None = root) + child_comment_ids. text is verbatim, unsanitized — treat as untrusted when rendering. |
| list_work_item_commentsA | List a work item's comments as a flat page. Threads reconstruct via parent_comment_id (None = root) + child_comment_ids. text is verbatim, unsanitized — treat as untrusted when rendering. |
| create_document_commentsA | Create one or more comments on a document in a single request. Reply: set parent_comment_id to a short ID from list_document_comments (None = top-level). 'text/html' text is sent unsanitized; omit author_id for the token's user. NOT idempotent — a retry duplicates. |
| create_work_item_commentsA | Create one or more comments on a work item in a single request. Reply: set parent_comment_id to a short ID from list_work_item_comments (None = top-level). Optional title sets the comment heading. 'text/html' text is sent unsanitized; omit author_id for the token's user. NOT idempotent — a retry duplicates. |
| update_document_commentA | Resolve or re-open one document comment thread. Root comments only (a reply 400s) — pick a root id (parent_comment_id=None) from list_document_comments; resolving the root resolves the whole thread. Idempotent. |
| update_work_item_commentA | Resolve or re-open one work item comment. Root comments only (a reply 400s) — pick a root id (parent_comment_id=None) from list_work_item_comments; resolving a root flips only that comment. Idempotent. |
| list_documentsA | List a project's documents. Returns space_id + document_name (inputs to the other document tools) plus type, status, updated timestamp, and display names of creator (author) and last editor (last_updated_by). Discovery scan cached 60s. |
| get_documentA | Get a document's metadata: title/type/status/editors/custom fields. Also returns outline numbering + autoSuspect (round-trip via update_document). author / last_updated_by are display names (creator, last editor); updated is the last-modified timestamp. include_homepage_content_html=True fills content_html with raw homePageContent HTML — the required source for update_document(home_page_content_html=...). That body is inline prose only (headings / embedded work items live elsewhere; read_document renders all). Never feed back a blanked (flag=False) body. |
| read_document_partsA | List a document's structural parts in order. Use for structure: part IDs (positions for move_work_item_to_document), heading levels, per-part Markdown. Plain reading → read_document; a document's work items → list_work_items. |
| read_documentA | Render a document end-to-end as flowing Markdown — THE way to read a body. Interleaves headings, work-item descriptions, and prose. Synthesis output: NEVER feed to update_document (anchors collapse, headings orphan) — round-trip via get_document(include_homepage_content_html=True). For metadata-only extraction prefer list_work_items SQL. |
| update_documentA | Update a Polarion document's metadata or body. PATCHes only supplied attributes (omitted preserved); no follow-up GET. Fetch via get_document BEFORE updating. home_page_content_html is never sanitized or converted — source from get_document(include_homepage_content_html=True); blocks lacking an id= get one auto-stamped, a fully anchored body is sent byte-for-byte. Empty string rejected (orphans headings) — pass '' for near-empty. Body rules:
workflow_action must pair with ≥1 attribute (else 400). Unknown status/type raise ValueError; custom_fields keys outside the document type's schema are rejected, values NOT validated — resolve via list_document_enum_options first. |
| create_documentA | Create a new Polarion document in a space. module_name must be unique in the space (duplicate → HTTP 409) — check list_documents first. type/status validated — unknown ids raise ValueError with options; custom_fields keys validated against the document type schema. home_page_content is Markdown → sanitized HTML, blocks auto-stamped with unique ids. Markdown tables get native Polarion styling; a paragraph starting 'Table:' directly after a table becomes a numbered caption widget. Post-create edits round-trip raw HTML via get_document(include_homepage_content_html=True) ↔ update_document; add work items via move_work_item_to_document. |
| list_work_item_enum_optionsA | List valid enum option ids for a work item field of a given type. Resolve enum ids here before create_work_items / update_work_items — enums are validated on write, invalid ids raise with this set. An unknown work_item_type silently falls back to ~, so verify the type id first. |
| list_document_enum_optionsA | List valid enum option ids for a document field of a given type. Resolve enum ids here before create_document / update_document — enums are validated on write, invalid ids raise with this set. An unknown document_type silently falls back to ~, so verify the type id first. |
| list_work_item_linksA | List a work item's links, one direction per call. Forward carries role (parent, verifies, …) and suspect; back is a Lucene fallback that drops role (always None) — recover it via forward on the source. |
| create_work_item_linksA | Create 1-50 outgoing links from one source work item, atomically. Role and target existence validated before POST — invalid ones raise ValueError. Per spec: target_project_id defaults to source, revision pins (else HEAD), suspect flags re-review. A 4xx (e.g. duplicate role+target → 409) rolls back the whole batch — re-query list_work_item_links before retrying. link_ids are the delete-path ids, input order. Phantom success: when the source sits in a document, move_work_item_to_document already auto-created one heading link; a NEW same-role link 201s but is NOT persisted — verify with list_work_item_links. |
| delete_work_item_linksA | Delete 1-50 outgoing links from one source work item. Outgoing only — delete a back link from its source item. Refs from list_work_item_links(direction="forward") or a prior create. Stale refs never raise: a pre-read splits results into deleted_link_ids / not_found_link_ids. |
| update_work_item_linkA | Set suspect and/or revision on one existing outgoing link. Identify the link via list_work_item_links(direction="forward") (role + target address one link). None = unchanged; at least one of suspect / revision required. One link per call. A role typo 404s. |
| move_work_item_to_documentA | Move an existing work item into a document at a given position. THE attach path: atomically sets module and inserts a part. Headings rejected (HTTP 400) — add headings via update_document . An item already in a document is moved, not copied. At most one of previous_part_id (AFTER) / next_part_id (BEFORE); omit both to append. Part IDs from read_document_parts. Auto-creates one link to the enclosing heading; a later same-role create_work_item_links returns 201 but is NOT persisted. |
| move_work_item_from_documentA | Detach a work item from its document — the ONLY detach path. NOT idempotent: an already free-floating item returns HTTP 400 — first confirm it is in a document (get_work_item: non-empty space_id) and skip the call when already detached. Item preserved, re-attachable via move_work_item_to_document. Headings detachable too. |
| list_projectsA | List accessible Polarion projects — the source of project IDs. Lucene query allows trailing wildcards (name:ILCU*); leading ones 400. |
| get_sql_query_recipesA | Fetch copy-paste SQL recipes for the list_work_items SQL:(...) prefix. Call before writing any SQL query (document scope, custom-field, traceability); adapt a recipe instead of hand-writing joins. Includes the table schema. |
| get_html_recipesA | Fetch the required HTML templates for tables, captions, links, and widgets written via update_work_items / update_document. Any new , numbered caption, work-item / cross-reference / wiki-page link, or TOC / Table-of-Figures widget must be adapted from these templates — plain hand-written markup renders unstyled and breaks numbering. Also covers macro-id and metadata-scope caveats. |
| create_test_runsA | Create 1-50 test runs in one project in a single bulk request. id is required per item (Polarion REST does not auto-generate one). type/status are validated against the project's testing enumerations and template_id against existing templates (list_test_runs(templates=True)) — unknown ids raise ValueError. custom_fields keys are validated against a sample of existing runs; enum-typed custom values are not (test runs have no options API). Atomic: one bad item rejects the whole batch; an id-count mismatch raises — re-query list_test_runs before retrying. |
| list_test_runsA | List / search test runs in a project. Returns actual run instances by default; set templates=True for the reusable template blueprints instead. Filter with a Lucene query (status:open, type:manual, author.id:, HAS_VALUE:) or omit for all. |
| create_work_itemsA | Create 1-50 work items in one project in a single bulk request. Standard enums (type/status/severity/priority) are validated — unknown ids raise ValueError with valid options. custom_fields keys are validated against the type's schema. Atomic: one bad item rejects the whole batch; an id-count mismatch raises — re-query list_work_items before retrying. Items are created free-floating; place into a document with move_work_item_to_document (this tool cannot). description is Markdown → sanitized HTML; later edits are raw-HTML round-trip via get_work_item(include_description_html=True) ↔ update_work_items. Markdown tables get native Polarion styling; a paragraph starting 'Table:' directly after a table becomes a numbered caption widget. |
| update_work_itemsA | Update fields on 1-50 existing work items in one bulk PATCH; unset fields stay unchanged. Per-item hyperlinks/assignee_ids REPLACE the stored lists: even to add ONE entry, call get_work_item on the target BEFORE updating and resubmit every existing entry plus the new one — anything omitted is silently deleted. description_html is raw Polarion HTML, sent verbatim — source from get_work_item(include_description_html=True); greenfield bodies use create_work_items Markdown, formats never mix. New table, caption, link, or widget HTML must be adapted from get_html_recipes templates, never hand-written. custom_fields is partial, keys outside the type schema rejected, values NOT validated — resolve via list_work_item_enum_options first. module not settable here — use move_work_item_to_document / move_work_item_from_document. workflow_action/change_type_to apply to EVERY item; each item needs ≥1 body field (else 400); change_type_to scopes status/severity/resolution to the target type and resets status. Unknown enum ids and missing/duplicate work_item_ids raise ValueError. Atomic: one bad item rejects the whole batch. Returns ids only — re-read via get_work_item if needed. |
| list_work_itemsA | List / search work items in a project. Lucene query (type:requirement, title:SRS*; leading wildcards 400) or omit for all. module and body text are NOT Lucene-indexed — scope by document via SQL:(...) or read_document_parts, never a Lucene module term. SQL:(...) runs native SQL: call get_sql_query_recipes first and adapt a recipe (document scope, custom-field, traceability), do not hand-write. Escape ' as ''; keep LIKE top-level via INNER JOIN (rejected inside EXISTS; C_DESCRIPTION LIKE never matches). |
| get_work_itemA | Get full details of one work item by ID. include_description_html=True fills description_html with raw HTML — the required source for update_work_items description_html. Never feed back a blanked (flag=False) body. |
| read_work_itemA | Read one work item with its body rendered as Markdown. get_work_item plus description as Markdown. Synthesis output (collapses Polarion anchors) — NEVER feed to update_work_items; round-trip via the HTML pair instead. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- 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/devemberx/mcp-server-polarion'
If you have feedback or need assistance with the MCP directory API, please join our Discord server