microsoft/add-knowledge
Add a knowledge source (public website or SharePoint) to a Copilot Studio agent. Use when the user asks to add a knowledge source, documentation URL, website, or SharePoint site for the agent to search.
npx skills add https://github.com/microsoft/skills-for-copilot-studio --skill add-knowledge
Add a knowledge source to the agent. Supports Public Website, SharePoint, and Custom API sources.
Glob: **/agent.mcs.yml
NEVER hardcode an agent name.
sharepoint.com → use SharePointSearchSource (but first normalize the URL — see below)OnKnowledgeRequested (see Custom API section below)PublicSiteSearchSourcehttps://contoso.sharepoint.com/sites/MySite/Shared%20Documents/MyFolder
Users often paste URLs in other formats. Handle them as follows:
| URL pattern | Example | Action |
|---|---|---|
| Direct path (/sites/.../Shared%20Documents/...) | https://x.sharepoint.com/sites/Site/Shared%20Documents/Folder | Use as-is — this is the correct format |
| AllItems.aspx with ?id= param (...AllItems.aspx?id=...) | https://x.sharepoint.com/.../AllItems.aspx?id=%2Fsites%2FSite%2FShared%20Documents%2FFolder&viewid=... | Extract and decode the id query parameter. URL-decode it to get the path (e.g. /sites/Site/Shared%20Documents/Folder), then prepend the origin (https://x.sharepoint.com) to build the direct path. Drop all query parameters (?id=, &viewid=, etc.) |
| Sharing link (/:f:/s/... or /:x:/s/...) | https://x.sharepoint.com/:f:/s/Site/EncodedToken?e=abc | Cannot convert — these are opaque sharing tokens with no extractable folder path. Ask the user: *"That's a SharePoint sharing link — I can't extract the folder path from it. Could you navigate to the folder in SharePoint, copy the URL from the browser address bar, and paste it here?"* |
Encoding rule: Spaces in the final URL must be encoded as %20 (e.g. Shared%20Documents, not Shared Documents).
node ${CLAUDE_SKILL_DIR}/../../scripts/schema-lookup.bundle.js resolve KnowledgeSourceConfiguration
Public Website:
> PublicSiteSearchSource uses Bing search to find relevant snippets within the scoped URL. It does not crawl or summarize full pages. The URL defines a search scope (not a specific page), and supports a maximum depth of 2 levels beyond the domain (e.g. https://example.com/docs/api works, https://example.com/docs/api/v2 is too deep and will be ignored).
# Name: <Name>
# <Description of what this knowledge source provides>
kind: KnowledgeSourceConfiguration
source:
kind: PublicSiteSearchSource
site: https://www.example.com/docs
SharePoint:
# Name: <Name>
# <Description of what this knowledge source provides>
kind: KnowledgeSourceConfiguration
source:
kind: SharePointSearchSource
site: https://contoso.sharepoint.com/sites/MySite/Shared%20Documents/MyFolder
# Name: and a description comment at the top. These are important for identifying the knowledge source.knowledge/<descriptive-name>.knowledge.mcs.yml directoryWhen the user wants to connect a proprietary search API or database not natively supported by Copilot Studio, use the OnKnowledgeRequested trigger. This is a YAML-only capability with no UI designer — it intercepts knowledge search requests and lets you call a custom API to populate results.
How it works:
OnKnowledgeRequested triggerSystem.SearchQuery (the AI-rewritten query) as input to your API callContent, ContentLocation, TitleSystem.SearchResults with the transformed resultsUse the template: ${CLAUDE_SKILL_DIR}/../../templates/topics/custom-knowledge-source.topic.mcs.yml
Prerequisites: The user needs a connector action (in actions/) that calls their search API. If they don't have one yet, they should create it through the Copilot Studio UI or VS Code extension first.
Knowledge source URLs support {VariableName} placeholders — typically global variables — for dynamic routing based on user context. This is powerful for scenarios where different users need different knowledge sources (e.g., geolocation-specific SharePoint folders, region-specific documentation).
Pattern: Define a global variable (via /copilot-studio:add-global-variable), populate it early in the conversation (e.g., in an OnActivity/conversation-init topic based on user profile or geolocation), then reference it in the knowledge source URL with Power Fx string interpolation.
SharePoint example — a workforce agent that routes to different SharePoint folders per region:
# Name: Regional HR KB
# This knowledge source provides HR information from the {Global.UserKBURL} SharePoint.
kind: KnowledgeSourceConfiguration
source:
kind: SharePointSearchSource
site: =$"{Global.UserKBURL}"
Public website example — documentation site with region-specific subpaths:
# Name: Regional Docs
# Documentation for the user's region at {Global.Region}.
kind: KnowledgeSourceConfiguration
source:
kind: PublicSiteSearchSource
site: =$"https://docs.example.com/{Global.Region}/api"
CRITICAL: URL format for the global variable value. The variable must contain a direct, clean URL — not a SharePoint UI URL with query parameters. Copilot Studio cannot resolve AllItems.aspx links.
| Correct (set this in the global variable) | Wrong (will not work) |
|---|---|
| https://contoso.sharepoint.com/sites/MySite/Shared Documents/MyFolder | https://contoso.sharepoint.com/.../AllItems.aspx?id=%2Fsites%2F...&viewid=... |
Note: spaces are OK in the variable value (unlike static site: values which need %20), because the Power Fx $"{Global.UserKBURL}" expression handles encoding at runtime.
Implementation checklist when the user asks for dynamic knowledge:
/copilot-studio:add-global-variable (e.g., UserKBURL, Region)=$"{Global.VariableName}" syntax in the site: fieldFor detailed guidance on how knowledge retrieval works, source selection, content quality, security, maintenance, and advanced patterns like triggerCondition, see knowledge-guide.md.
This skill can create Public Website and SharePoint knowledge sources.
For other types, inform the user:
> "The following knowledge source types must be created through the Copilot Studio UI as they require Power Platform configuration:
> - Dataverse tables
> - Uploaded files
> - AI Search
> - SQL Server
>
> Please create these in the portal, then clone the solution to edit them here."
Take microsoft/add-knowledge from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.