Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add thangchung/agent-engineering-experiment --skill entra-a2a-mcp-obogit clone --depth 1 https://github.com/thangchung/agent-engineering-experimentWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/thangchung/agent-engineering-experiment/entra-a2a-mcp-obo)<a href="https://agentmods.dev/skills/thangchung/agent-engineering-experiment/entra-a2a-mcp-obo"><img src="https://agentmods.dev/badge/skills/thangchung/agent-engineering-experiment/entra-a2a-mcp-obo/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/thangchung/agent-engineering-experiment/entra-a2a-mcp-obo"><img src="https://agentmods.dev/badge/skills/thangchung/agent-engineering-experiment/entra-a2a-mcp-obo.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00175 | $0.03356 |
| Opus 5 | $0.00088 | $0.01678 |
| Sonnet 5 | $0.00035 | $0.00671 |
| Haiku 4.5 | $0.00017 | $0.00336 |
Grade A, and why
entra-a2a-mcp-obo scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 11d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 211 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Entra + A2A + MCP + Agentgateway OBO — Best Practices
Distilled from real setup runs and source-code verification (agentgateway v1.4.0-alpha.1, MCP C# SDK, A2A .NET SDK). Prove, don't guess — every rule below traces to a verified source or a real error hit during setup.
0. Reminder rule — ALWAYS surface real inputs
These are per-tenant/per-app real values. Never invent, never leave silently blank.
Whenever a task needs one, say so explicitly in chat before/while writing config, e.g.
👉 INPUT needed: <execAppId> — get from setup script output "ExecutorAgent Blueprint appId=...".
| Placeholder | What | Typical source |
|---|---|---|
tenantId |
Entra tenant GUID | az account show --query tenantId / Connect-MgGraph output |
webAppId |
Web SPA app registration appId |
setup script output Web appId=... |
execAppId |
ExecutorAgent Blueprint appId |
setup script output ExecutorAgent Blueprint appId=... |
execAppSecret |
ExecutorAgent Blueprint client secret | az ad app credential reset --id <execAppId> |
checkAppId |
CheckerAgent Blueprint appId |
setup script output CheckerAgent Blueprint appId=... |
checkAppSecret |
CheckerAgent Blueprint client secret | az ad app credential reset --id <checkAppId> |
mcpAppId |
McpServer app registration appId |
setup script output McpServer appId=... |
executorAgentIdentityAppId |
Executor Agent Identity instance appId | setup script output ExecutorAgent instance agentIdentityAppId=... |
checkerAgentIdentityAppId |
Checker Agent Identity instance appId | setup script output CheckerAgent instance agentIdentityAppId=... |
Never guess these. Never fill code/config with them silently — flag with 👉 INPUT inline
and call it out in the chat response too.
1. Entra ID app registrations (entra-app-registration)
- Web/SPA apps: use
redirectUri = window.location.origin, never hardcode a port unless it's fixed. - Service/API apps (Mcp, Checker, Executor when acting as resource): expose an API scope
named
access_as_user, take note of its scope GUID — needed for OBO permission grants. - Always record
appId(client ID) — everything downstream (jwtAuth audiences, MSAL config, appsettingsAzureAd:ClientId) keys off it. Tenant ID is shared across all apps. - Secrets: never print/store in scripts or docs. Generate via
az ad app credential reset, pipe straight intodotnet user-secrets setor Key Vault. Rotate on expiry. preAuthorizedApplicationsPATCH payloads onapi.oauth2PermissionScopes— Graph API is picky:permissionIds(notscopeIds), array of GUIDs, wrapped correctly. A 400"An unexpected 'StartArray' node..."almost always means a naked array where an object with avaluekey on it or a wrapper property was expected — check Graph API docs for the exact schema, don't guess field names.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 11d ago First seen · 211 lines · 175 tokens per session scan A 0ff8c74f534e
entra-a2a-mcp-obo is a skill published in the GitHub repository thangchung/agent-engineering-experiment (25 stars, last pushed 1mo ago), licensed MIT. It adds 175 tokens to every session and 3,356 once invoked, about $0.0009 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.
Other skills, from other repositories
phoenix-cli-development
Design and implementation guide for the Phoenix CLI (px). Covers the noun-verb command structure, dual-audience design (humans and coding agents), Commander.js patterns, configuration resolution, output formats, exit codes, and conventions for adding or modifying commands. Triggers when working on phoenix-cli commands…
annotate-spans
Write effective, consistent annotations on LLM/agent spans and traces, and coach the user on annotation practice. Load this whenever you are about to record structured feedback with the ui.spans.annotate operation (via executebrowseraction), or when the user asks how to annotate, label, score, or review spans/traces…
playground
Author, edit, or iterate on prompts in the Phoenix prompt playground, including running experiments over a dataset. Load before any playground ui. operation call, including single-shot prompt rewrites.
experiments
Run, read, and compare dataset-backed experiments to find evidence that a prompt or pipeline is improving. Trigger when the user wants to iterate over a dataset with experiments, compare experiment runs, read experiment quality/latency/cost, or decide whether a change actually helped. Running a prompt over a dataset…
phoenix-graphql
Write efficient GraphQL queries against the Phoenix API. Load this skill in two cases: (1) before composing any non-trivial GraphQL query yourself for data analysis (via the phoenix-gql bash command) — it contains schema entrypoints and patterns that eliminate the need for introspection; (2) when the user asks for…
datasets
Understand what a Phoenix dataset is and reason well about its examples, outputs, splits, and how it feeds evaluators and experiments. Load this whenever a dataset is in view or the user asks what a dataset is, how splits work, what an output "means", or how datasets relate to experiments and evals. This skill governs…