Serve LogicSRC's own OpenProfile.md, and install OpenMCP with one line (#156)

logicsrc.com/.well-known/openprofile.md was a 404 while every relay in the
OpenMCP catalog, Obscura included, named it as its operator. The site that
publishes the spec now serves its own file: Kind organization, accounts
(GitHub, blog, the catalog, the Obscura relay so the trust chain closes both
ways), topics, projects and contact. The root layout carries
rel="openprofile" and every response carries the same relation as a Link
header, per the spec's discovery rules. skill.md and llms.txt point at it.

The OpenMCP spec page and docs/openmcp.md now lead with
curl -fsSL https://openmcp.logicsrc.com/install.sh | sh instead of npx, and
the descriptor examples name logicsrc.com's real profile rather than one
profullstack.com never served.


Claude-Session: https://claude.ai/code/session_01Qh2dieNyPZ4Hx5g3XNJ1Eo

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Anthony Ettinger 2026-09-12 10:55:52 -07:00 • committed by GitHub
parent 22fdfd0c55
commit 0f6326e910
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 94 additions and 5 deletions

View file

@ -24,6 +24,12 @@ const securityHeaders = [
{ key: "X-Frame-Options", value: "SAMEORIGIN" }, { key: "X-Frame-Options", value: "SAMEORIGIN" },
{ key: "Referrer-Policy", value: "strict-origin-when-cross-origin" }, { key: "Referrer-Policy", value: "strict-origin-when-cross-origin" },
{ key: "Permissions-Policy", value: "camera=(), microphone=(), geolocation=()" }, { key: "Permissions-Policy", value: "camera=(), microphone=(), geolocation=()" },
// OpenProfile.md discovery for responses that are not HTML (feeds, JSON,
// the specs as Markdown): the same relation the root layout puts in <head>.
{
key: "Link",
value: `<${(process.env.PUBLIC_URL ?? "https://logicsrc.com").replace(/\/$/, "")}/.well-known/openprofile.md>; rel="openprofile"`,
},
]; ];
/** /**

View file

@ -0,0 +1,50 @@
const SITE_URL = (process.env.PUBLIC_URL ?? "https://logicsrc.com").replace(/\/$/, "");
// GET /.well-known/openprofile.md: LogicSRC's own OpenProfile.md, the file the
// spec at /openprofile says a domain serves for itself. Relays in the OpenMCP
// catalog name this URL as their operator, so it has to resolve.
export function GET(): Response {
const body = `# LogicSRC
- **Kind**: organization
- **Handle**: @logicsrc
- **Web**: ${SITE_URL}
- **Email**: support@logicsrc.com
- **Avatar**: ${SITE_URL}/icon.svg
- **Parent**: [Profullstack, Inc.](https://profullstack.com)
Open coordination standards for humans, AI agents, plugins, payment systems and hosted products.
## Accounts
- [GitHub](https://github.com/profullstack/logicsrc)
- [GitHub org](https://github.com/logicsrc)
- [Blog](${SITE_URL}/blog)
- [OpenMCP catalog](https://openmcp.logicsrc.com)
- [Obscura relay](https://obscura.openmcp.logicsrc.com)
## Topics
- open standards, coordination, ai agents, mcp, openmcp, openprofile, openresume, openjob, opencreds, asdlc, credential sharing, agent orchestration
## Projects
- [OpenMCP](${SITE_URL}/openmcp): an open catalog of MCP relays, live at https://openmcp.logicsrc.com
- [OpenProfile.md](${SITE_URL}/openprofile): one Markdown file for who and where, people and agents alike
- [ASDLC](${SITE_URL}/asdlc): the agentic software development lifecycle
- [OpenCreds](${SITE_URL}/opencreds): end-to-end encrypted credential sharing
- [Docs](${SITE_URL}/docs): every specification LogicSRC publishes
## Contact
- Support: support@logicsrc.com
- Security: security@profullstack.com
- Privacy: privacy@profullstack.com
`;
return new Response(body, {
headers: {
"content-type": "text/markdown; charset=utf-8",
"cache-control": "public, max-age=3600",
},
});
}

View file

@ -77,6 +77,11 @@ const jsonLd = {
export default function RootLayout({ children }: { children: ReactNode }): ReactNode { export default function RootLayout({ children }: { children: ReactNode }): ReactNode {
return ( return (
<html lang="en"> <html lang="en">
<head>
{/* OpenProfile.md discovery (/openprofile, rule "A link element"): the
site points at its own profile, the one relays name as operator. */}
<link rel="openprofile" href={`${SITE_URL}/.well-known/openprofile.md`} />
</head>
<body> <body>
<script <script
type="application/ld+json" type="application/ld+json"

View file

@ -18,6 +18,8 @@ export function GET(): Response {
## Standards & products ## Standards & products
- [ASDLC](${SITE_URL}/asdlc): The Agentic Software Development Lifecycle: nine phases for building software when agents work in parallel and CI/CD is the only gate, with conformance levels and the ratchet rule. - [ASDLC](${SITE_URL}/asdlc): The Agentic Software Development Lifecycle: nine phases for building software when agents work in parallel and CI/CD is the only gate, with conformance levels and the ratchet rule.
- [OpenMCP](${SITE_URL}/openmcp): An open catalog of MCP relays. Live catalog at https://openmcp.logicsrc.com; CLI installs with \`curl -fsSL https://openmcp.logicsrc.com/install.sh | sh\`.
- [OpenProfile.md](${SITE_URL}/openprofile): One Markdown file for who and where, people and agents alike. This site's own is at ${SITE_URL}/.well-known/openprofile.md.
- [OpenProfile.md](${SITE_URL}/openprofile): One Markdown file that says who you are and where you are, for people and agents alike: identity block, accounts, topics, reshare terms and operator, discovered at /.well-known/openprofile.md or through rel="openprofile". - [OpenProfile.md](${SITE_URL}/openprofile): One Markdown file that says who you are and where you are, for people and agents alike: identity block, accounts, topics, reshare terms and operator, discovered at /.well-known/openprofile.md or through rel="openprofile".
- [OpenMCP](${SITE_URL}/openmcp): An open catalog of MCP relays: a relay serves /.well-known/openmcp.json, a catalog probes it and lists only what it found, and clients reach every relay through the catalog's REST, its own MCP endpoint, or signed webhooks. - [OpenMCP](${SITE_URL}/openmcp): An open catalog of MCP relays: a relay serves /.well-known/openmcp.json, a catalog probes it and lists only what it found, and clients reach every relay through the catalog's REST, its own MCP endpoint, or signed webhooks.
- [AgentSwarm](${SITE_URL}/agent-swarm): Provider-neutral agent orchestration, model routing, and cost controls. - [AgentSwarm](${SITE_URL}/agent-swarm): Provider-neutral agent orchestration, model routing, and cost controls.

View file

@ -18,11 +18,13 @@ const DESCRIPTOR = `{
"description": "A job board where agents apply to agents.", "description": "A job board where agents apply to agents.",
"auth": { "kind": "bearer", "open": ["search_jobs", "get_job"] }, "auth": { "kind": "bearer", "open": ["search_jobs", "get_job"] },
"tags": ["jobs", "hiring", "agents"], "tags": ["jobs", "hiring", "agents"],
"operator": "https://profullstack.com/.well-known/openprofile.md", "operator": "https://logicsrc.com/.well-known/openprofile.md",
"tools": ["search_jobs", "get_job", "apply_to_job", "post_update"] "tools": ["search_jobs", "get_job", "apply_to_job", "post_update"]
}`; }`;
const CLI = `npx @logicsrc/openmcp serve --url https://catalog.example # run a catalog const INSTALL = `curl -fsSL https://openmcp.logicsrc.com/install.sh | sh`;
const CLI = `openmcp serve --url https://catalog.example # run a catalog
openmcp add https://agenticjobs.work # register by any URL on the relay openmcp add https://agenticjobs.work # register by any URL on the relay
openmcp find "post an update" # search every relay's tools openmcp find "post an update" # search every relay's tools
openmcp call agenticjobs.work post_update '{"body":"Shipped."}' --relay-token <t> openmcp call agenticjobs.work post_update '{"body":"Shipped."}' --relay-token <t>
@ -177,7 +179,18 @@ export default function OpenMcpPage(): ReactNode {
<div className="band"> <div className="band">
<div className="section-head"> <div className="section-head">
<h2>From a terminal</h2> <h2>From a terminal</h2>
<p>
One line installs the reference catalog and client under your home directory. No root,
no package manager, and Node 24 is fetched if the box does not have it.
</p>
</div> </div>
<pre style={pre}>{INSTALL}</pre>
<p style={{ color: "#41505d", margin: "0.75rem 0 1rem" }}>
Then <code style={mono}>openmcp update</code> keeps it current and{" "}
<code style={mono}>openmcp uninstall</code> removes exactly what was installed. The catalog
at <a href="https://openmcp.logicsrc.com/">openmcp.logicsrc.com</a> is the default; set{" "}
<code style={mono}>OPENMCP_CATALOG</code> to point at another.
</p>
<pre style={pre}>{CLI}</pre> <pre style={pre}>{CLI}</pre>
</div> </div>
@ -215,7 +228,8 @@ export default function OpenMcpPage(): ReactNode {
</li> </li>
<li> <li>
<a href="https://github.com/logicsrc/openmcp">github.com/logicsrc/openmcp</a>: the <a href="https://github.com/logicsrc/openmcp">github.com/logicsrc/openmcp</a>: the
reference catalog and client, <code style={mono}>npx @logicsrc/openmcp</code> reference catalog and client:{" "}
<code style={mono}>curl -fsSL https://openmcp.logicsrc.com/install.sh | sh</code>
</li> </li>
<li> <li>
<Link href="/openprofile">OpenProfile.md</Link>, the operator behind a relay;{" "} <Link href="/openprofile">OpenProfile.md</Link>, the operator behind a relay;{" "}

View file

@ -19,6 +19,8 @@ Base URL: ${SITE_URL}
- Blog feed: ${SITE_URL}/blog/rss.xml - Blog feed: ${SITE_URL}/blog/rss.xml
- Sitemap: ${SITE_URL}/sitemap.xml - Sitemap: ${SITE_URL}/sitemap.xml
- LLM orientation: ${SITE_URL}/llms.txt - LLM orientation: ${SITE_URL}/llms.txt
- Who runs this site, as OpenProfile.md: ${SITE_URL}/.well-known/openprofile.md
- OpenMCP catalog of MCP relays: https://openmcp.logicsrc.com (install the CLI: curl -fsSL https://openmcp.logicsrc.com/install.sh | sh)
## What you can do here ## What you can do here

View file

@ -32,7 +32,7 @@ A relay serves a JSON document at `/.well-known/openmcp.json` on its own origin.
"url": "https://agenticjobs.work", "url": "https://agenticjobs.work",
"auth": { "kind": "bearer", "url": "https://agenticjobs.work/me/tokens", "open": ["search_jobs", "get_job"] }, "auth": { "kind": "bearer", "url": "https://agenticjobs.work/me/tokens", "open": ["search_jobs", "get_job"] },
"tags": ["jobs", "hiring", "agents"], "tags": ["jobs", "hiring", "agents"],
"operator": "https://profullstack.com/.well-known/openprofile.md", "operator": "https://logicsrc.com/.well-known/openprofile.md",
"webhooks": "https://agenticjobs.work/api/v1/webhooks", "webhooks": "https://agenticjobs.work/api/v1/webhooks",
"tools": ["search_jobs", "get_job", "apply_to_job", "post_update"], "tools": ["search_jobs", "get_job", "apply_to_job", "post_update"],
"catalogs": ["https://openmcp.logicsrc.com"] "catalogs": ["https://openmcp.logicsrc.com"]
@ -151,7 +151,17 @@ A conforming client:
## Serving one ## Serving one
By hand, or `openmcp descriptor <mcp url>` prints a template. [agenticjobs](https://agenticjobs.work), [tsbb](https://tsbb.dev) and [myna](https://mynaposter.com) serve one. The reference catalog runs on Node 24 with one SQLite file: `npx @logicsrc/openmcp serve`. By hand, or `openmcp descriptor <mcp url>` prints a template. [agenticjobs](https://agenticjobs.work), [tsbb](https://tsbb.dev) and [myna](https://mynaposter.com) serve one. The reference catalog runs on Node 24 with one SQLite file: `openmcp serve`.
## The reference implementation
[github.com/logicsrc/openmcp](https://github.com/logicsrc/openmcp) is the catalog server and the client, published as `@logicsrc/openmcp`, and [openmcp.logicsrc.com](https://openmcp.logicsrc.com) is a live catalog running it. One line installs the `openmcp` command under your home directory, with no root and no package manager, fetching Node 24 if the box does not have it:
```sh
curl -fsSL https://openmcp.logicsrc.com/install.sh | sh
```
`openmcp update` re-runs the installer; `openmcp uninstall` removes exactly the paths it wrote, from a manifest, with no network. The live catalog is the default target; `OPENMCP_CATALOG` or `--catalog` points the client at another.
## Related standards ## Related standards