Dynamic Skills
Summary
File-system owned skills have several challenges:
- Because they are static, they do not compose and cannot be assembled without a client-side build process at install; they cannot factor in customization by project, by user
- They require synchronization and updating on the client side
- It is difficult to monitor telemetry without client-side hooks
Zeeq dynamic skills are delivered as MCP prompts that allow assembly of standard templates into a single skill.
| Feature | SKILL.md | Zeeq Dynamic Skill |
|---|---|---|
| Static text | ✅ | ✅ |
| Dynamic text per repository | ❌ | ✅ |
| Telemetry on usage by user | ❌ | ✅ |
| Easily deployed across all projects | ❌ | ✅ |
| Automatically updated instantly | ❌ | ✅ |
| Automatically delivered to all connected clients | ❌ | ✅ |
The common use case is an agent skill that is 80% identical across the organization (for example, a standard research skill), but 20% specialized per repository. Instead of managing two separate skill files that will drift, Zeeq dynamic skills make it easy for enterprise teams to share common skill bases and compose with per-repository fragments.
This allows ease of updating behaviors across skills, developers and teams to share skills yet still be able to personalize them, and low-friction updates to skills without having to re-deploy or re-install them.
Designating documents as dynamic skills
Any document in a document library can be designated as a dynamic skill by selecting Use as organization skill or toggling the document from Used as content to Used as skill.

When a document is designated as a dynamic skill, it will show up in the harness as an operator invoked skill:

Using fragments
The power of dynamic skills comes from fragments.
The skill can leave zero or more placeholders in the file:

A placeholder is an XML fragment like:
<zeeq_placeholder
name="a-placeholder-name"
label="Optional display label"
description="Optional description for configuration">
Default value if none supplied (can be empty)
</zeeq_placeholder>
In this case, the prompt will render with 5 as the default value:
---
name: hello-world
description: Eager greeter that says hello world!
keywords: hello world
---
# Hello, World!
Say hello world.
Language count=5
languages and include the flag emoji for the country.
In the repo configuration, setting a value for the placeholder with a fragment will cause the skill to be rendered dynamically:

The fragment value is:
5 latin languages, 5 asian languages
This allows this repository to customize the skill and use the same skill to produce 10 greetings instead.
Agent harness
Now in Claude:

And Cursor as another example:

Telemetry and observability
A key reason for enterprises to adopt dynamic skills is to track usage and observability across the organization:

This lets enterprise teams understand the high leverage skills and their activation rates by users and across harnesses.
Harness configuration
To enable dynamic skills to resolve the fragments to apply, the harness must supply the repository identifier as a header x-zeeq-prompts-repo.
The value should match your repository identifier like zeeq-ai/zeeq-app or my-org/my-repo.
Claude Code
{
"mcpServers": {
"zeeq": {
"type": "http",
"url": "https://app.zeeq.ai/mcp",
"timeout": 120000,
"headers": {
"x-zeeq-prompts-repo": "zeeq-ai/zeeq-app"
}
}
}
}
Cursor
{
"mcpServers": {
"zeeq": {
"url": "https://app.zeeq.ai/mcp",
"auth": {
"scopes": ["mcp:tools"]
},
"headers": {
"x-zeeq-prompts-repo": "zeeq-ai/zeeq-app"
}
}
}
}
OpenCode
{
"$schema": "https://opencode.ai/config.json",
"experimental": {
"mcp_timeout": 300000
},
"mcp": {
"zeeq": {
"type": "remote",
"enabled": true,
"url": "https://app.zeeq.ai/mcp",
"headers": {
"x-zeeq-prompts-repo": "zeeq-ai/zeeq-app"
}
}
}
}
VS Code Copilot
{
"servers": {
"zeeq": {
"type": "http",
"url": "https://app.zeeq.ai/mcp",
"headers": {
"x-zeeq-prompts-repo": "zeeq-ai/zeeq-app"
}
}
}
}
Conceptual design
The high level conceptual design of how dynamic skills work: