Making a deployed Copilot Studio agent live
A Factory deploy lands two solutions and publishes them, and the agent still answers "I don't have access to that data". Nothing is broken. Four things are missing, and only one of them is in the Factory's own manual steps.
claude-in-chrome is the law here. Never launch a separate browser to drive Copilot Studio.
The four gates, in order
1. Auth mode must be Maker, not User
This is the one that costs hours. Open the agent → Tools → click the MCP server chip → Edit MCP server → Authentication mode.
It defaults to User. Under User auth the tools are attached, they appear in the maker panel, the solution is published — and they never reach the agent runtime. The agent truthfully reports it has no tools. Switch to Maker, Confirm, publish.
Symptom you will see first: the agent says "no MCP tools are connected to this
session", or it reaches for an unrelated tool (list_bash) because it is
pattern-matching your words against a toolset that does not contain what you
asked for.
2. Attach the MCP server to EVERY agent, parent and child
The Factory's manual steps say "once per agent" and mean it. A parent that delegates to a connected child needs it on both — the 404 will surface as the parent reporting failure when it is actually the child that cannot see the data.
3. The attach does not survive a failed publish
If a publish fails ("We couldn't publish your agent"), go back and check Tools — the attach will be gone. Re-attach, then verify by reopening the panel before publishing again. Do not assume it stuck.
Preview tests the draft, so you can verify the attach works before you publish. Do that: attach → Preview → ask a real question → then publish.
4. Individual tool toggles are a red herring
Inside Edit MCP server each tool has its own switch, and they render greyed
out. They are checked: true, disabled: true — "Enable all tools" at the top is
on and forces them. Do not spend time trying to flip them.
Making it presentable
The name is capped at 30 characters and truncates SILENTLY
"Regional Revenue Briefing Agent" is 31 characters. It saves as "Regional Revenue Briefing Agen" with no error and no warning. Count first, or check the saved value after.
Factory-generated names are also embarrassing on camera —
Revenuebriefbuilder Generate Revenue Brief Agent Agent, with the doubled
suffix. Rename before filming.
End user preview hides the build machinery
The toggle sits top-right of the Preview pane and defaults off. On, it hides
the chain-of-thought rows and the raw tool identifiers
(get_revenuebriefbuildergeneratealternativebriefformatsagent). Off, those
are on screen for the whole take and are instantly disqualifying for anything
customer-facing.
Verify per-response, not once — behaviour can differ between answers.
Return does not submit
The chat box ignores Return. Click the send arrow at the input's right edge. A whole take can be lost to this: the text sits in the box looking submitted.
Verify before you believe it
Ask a question whose answer can only come from the data server, and read the response for a real record id. "It replied" is not evidence — the agent will happily explain that it cannot find anything, which is correct behaviour and looks like success if you only glance.
Good probe: "List the briefing records you can see for ."
Related
/tab-film for capturing the result. /mcs-deploy for the deploy itself.
Run this — do not improvise
This capability's deterministic implementation is a RAPP single-file agent, linked beside this file as cs_agent_live_agent.py and embedded as the fenced Python below (sha256 5a5286fa31623faf…; a byte-exact copy is also vaulted in the capsule comment at the end of this file). On a host with sandbox execution, run the linked file directly — if it is missing, write the fence contents verbatim to cs_agent_live_agent.py first:
python3 cs_agent_live_agent.py '{"key": "value"}' # arguments as one JSON object
echo '{"key": "value"}' | python3 cs_agent_live_agent.py # or on stdin
python3 cs_agent_live_agent.py --tool # emit the JSON tool contract
Treat stdout as a tool result. If it reports missing or unresolved inputs, stop and collect them. If it returns steps, execute those steps in order exactly as returned; if it returns instructions, follow them with the supplied inputs. Otherwise use the result verbatim. Do not invent behavior beyond that output. On a host without code execution, treat the Parameters schema and the code below as the exact specification and never paraphrase a step. Never edit inside the generated markers; a converter-equipped host can instead restore the original file checksum-verified with the installed rapp-agent-converter/scripts/toast.py convert SKILL.md --to agent.
"""CsAgentLive -- Take a Copilot Studio agent that was generated and deployed by the RAPP Factory and make it actually answer from its data — then make it presentable enough to film. Covers the MCP attach, the auth mode that everyone gets wrong, the silent name truncation, and the toggle that hides the build machinery. Trigger when a deployed agent "has no data", reports 404 from its data server, or looks machine-generated on screen.
Generated by the rapp skill from cs-agent-live. The RCI capsule at the bottom of this file carries the full original; `toast.py convert` restores it byte-exact."""
import json
import re
import sys
try:
from agents.basic_agent import BasicAgent
except ImportError: # running OUTSIDE a brainstem -- stay executable anyway.
class BasicAgent: # noqa: D101 - minimal stand-in, same contract
def __init__(self, name=None, metadata=None):
if name:
self.name = name
if metadata:
self.metadata = metadata
def perform(self, **kwargs):
return "Not implemented."
def system_context(self):
return None
def to_tool(self):
return {"type": "function", "function": {
"name": self.name,
"description": self.metadata.get("description", ""),
"parameters": self.metadata.get("parameters", {})}}
# The procedural layer, verbatim from the source capability.
INSTRUCTIONS = '# Making a deployed Copilot Studio agent live\n\nA Factory deploy lands two solutions and publishes them, and the agent still\nanswers "I don't have access to that data". Nothing is broken. Four things are\nmissing, and only one of them is in the Factory's own manual steps.\n\n**claude-in-chrome is the law here.** Never launch a separate browser to drive\nCopilot Studio.\n\n## The four gates, in order\n\n### 1. Auth mode must be Maker, not User\n\nThis is the one that costs hours. Open the agent → **Tools** → click the MCP\nserver chip → **Edit MCP server** → **Authentication mode**.\n\nIt defaults to **User**. Under User auth the tools are attached, they appear in\nthe maker panel, the solution is published — and they **never reach the agent\nruntime**. The agent truthfully reports it has no tools. Switch to **Maker**,\nConfirm, publish.\n\nSymptom you will see first: the agent says *"no MCP tools are connected to this\nsession"*, or it reaches for an unrelated tool (`list_bash`) because it is\npattern-matching your words against a toolset that does not contain what you\nasked for.\n\n### 2. Attach the MCP server to EVERY agent, parent and child\n\nThe Factory's manual steps say "once per agent" and mean it. A parent that\ndelegates to a connected child needs it on both — the 404 will surface as the\nparent reporting failure when it is actually the child that cannot see the data.\n\n### 3. The attach does not survive a failed publish\n\nIf a publish fails ("We couldn't publish your agent"), **go back and check\nTools** — the attach will be gone. Re-attach, then verify by reopening the panel\nbefore publishing again. Do not assume it stuck.\n\nPreview tests the **draft**, so you can verify the attach works before you\npublish. Do that: attach → Preview → ask a real question → then publish.\n\n### 4. Individual tool toggles are a red herring\n\nInside **Edit MCP server** each tool has its own switch, and they render greyed\nout. They are `checked: true, disabled: true` — "Enable all tools" at the top is\non and forces them. Do not spend time trying to flip them.\n\n## Making it presentable\n\n### The name is capped at 30 characters and truncates SILENTLY\n\n"Regional Revenue Briefing Agent" is 31 characters. It saves as\n**"Regional Revenue Briefing Agen"** with no error and no warning. Count first,\nor check the saved value after.\n\nFactory-generated names are also embarrassing on camera —\n`Revenuebriefbuilder Generate Revenue Brief Agent Agent`, with the doubled\nsuffix. Rename before filming.\n\n### End user preview hides the build machinery\n\nThe toggle sits top-right of the Preview pane and defaults **off**. On, it hides\nthe chain-of-thought rows and the raw tool identifiers\n(`get_revenuebriefbuildergeneratealternativebriefformatsagent`). Off, those\nare on screen for the whole take and are instantly disqualifying for anything\ncustomer-facing.\n\nVerify per-response, not once — behaviour can differ between answers.\n\n### Return does not submit\n\nThe chat box ignores Return. Click the send arrow at the input's right edge.\nA whole take can be lost to this: the text sits in the box looking submitted.\n\n## Verify before you believe it\n\nAsk a question whose answer can only come from the data server, and read the\nresponse for a real record id. "It replied" is not evidence — the agent will\nhappily explain that it cannot find anything, which is correct behaviour and\nlooks like success if you only glance.\n\nGood probe: *"List the briefing records you can see for <topic>."*\n\n## Related\n\n`/tab-film` for capturing the result. `/mcs-deploy` for the deploy itself.'
# Ordered commands lifted verbatim from the capability's own documentation.
STEPS = []
class CsAgentLiveAgent(BasicAgent):
def __init__(self):
self.name = 'CsAgentLive'
self.metadata = {
"name": "CsAgentLive",
"description": "Take a Copilot Studio agent that was generated and deployed by the RAPP Factory and make it actually answer from its data \u2014 then make it presentable enough to film. Covers the MCP attach, the auth mode that everyone gets wrong, the silent name truncation, and the toggle that hides the build machinery. Trigger when a deployed agent \"has no data\", reports 404 from its data server, or looks machine-generated on screen.",
"parameters": {
"type": "object",
"properties": {},
"required": []
}
}
super().__init__(name=self.name, metadata=self.metadata)
def perform(self, **kwargs): # toaster:generated-perform
return json.dumps({"status": "ok", "instructions": INSTRUCTIONS,
"inputs": kwargs,
"note": "Prose-only capability: follow INSTRUCTIONS "
"with the given inputs."}, indent=2)
if __name__ == "__main__":
# echo '{"arg": "value"}' | python3 cs_agent_live_agent.py
# python3 cs_agent_live_agent.py '{"arg": "value"}'
# python3 cs_agent_live_agent.py --tool # emit the JSON tool contract
_a = sys.argv[1:]
if _a and _a[0] == "--tool":
print(json.dumps(CsAgentLiveAgent().to_tool(), indent=2))
else:
_raw = _a[0] if _a else (sys.stdin.read().strip() or "{}")
print(CsAgentLiveAgent().perform(**json.loads(_raw)))
# rci-capsule:v1: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