Rank
83
A Model Context Protocol (MCP) server for GitLab
Traction
No public download signal
Freshness
Updated 2d ago
Crawler Summary
Build ChatGPT Apps easily. [!CAUTION] This library is still in early development. Things may change rapidly and there may be bugs. Use at your own risk. Also I would appreciate contributions for the documentation and the library itself! ChatGPT.js A TypeScript/JavaScript library for building ChatGPT Apps easily. It only takes ~30 lines of code to create a simple ChatGPT App with a widget! What does it do? chatgpt.js combines Model Context Prot Published capability contract available. No trust telemetry is available yet. 4 GitHub stars reported by the source. Last updated 2/24/2026.
Freshness
Last checked 2/22/2026
Best For
Contract is available with explicit auth and schema references.
Not Ideal For
chatgpt.js is not ideal for teams that need stronger public trust telemetry, lower setup complexity, or more explicit contract coverage before production rollout.
Evidence Sources Checked
editorial-content, capability-contract, runtime-metrics, public facts pack
Build ChatGPT Apps easily. [!CAUTION] This library is still in early development. Things may change rapidly and there may be bugs. Use at your own risk. Also I would appreciate contributions for the documentation and the library itself! ChatGPT.js A TypeScript/JavaScript library for building ChatGPT Apps easily. It only takes ~30 lines of code to create a simple ChatGPT App with a widget! What does it do? chatgpt.js combines Model Context Prot
Public facts
7
Change events
1
Artifacts
0
Freshness
Feb 22, 2026
Published capability contract available. No trust telemetry is available yet. 4 GitHub stars reported by the source. Last updated 2/24/2026.
Trust score
Unknown
Compatibility
MCP
Freshness
Feb 22, 2026
Vendor
Tolga1452
Artifacts
0
Benchmarks
0
Last release
1.0.0-alpha.6
Key links, install path, and a quick operational read before the deeper crawl record.
Summary
Published capability contract available. No trust telemetry is available yet. 4 GitHub stars reported by the source. Last updated 2/24/2026.
Setup snapshot
git clone https://github.com/Tolga1452/chatgpt.js.gitSetup complexity is MEDIUM. Standard integration tests and API key provisioning are required before connecting this to production workloads.
Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data.
Everything public we have scraped or crawled about this agent, grouped by evidence type with provenance.
Vendor
Tolga1452
Protocol compatibility
MCP
Auth modes
mcp, api_key
Machine-readable schemas
OpenAPI or schema references published
Adoption signal
4 GitHub stars
Handshake status
UNKNOWN
Crawlable docs
6 indexed pages on the official domain
Merged public release, docs, artifact, benchmark, pricing, and trust refresh events.
Extracted files, examples, snippets, parameters, dependencies, permissions, and artifact metadata.
Extracted files
0
Examples
6
Snippets
0
Languages
typescript
bash
npm install chatgpt.js @chatgpt.js/react
text
my-chatgpt-app/
└── src/
├── index.ts
└── widgets/
└── my-widget/
├── data.ts
├── index.tsx
└── index.css (optional)ts
import { App } from 'chatgpt.js';
// Create the app instance, it's as simple as that!
const app = new App({
mcp: {
serverInfo: {
name: 'my-mcp',
version: '1.0.0'
}
},
widgetsDir: 'src/widgets'
});
// Register a tool, this one is also super simple!
app.registerTool(tool => tool
.setName('my_tool')
.setDescription('This is my first tool!')
.setInvoking('This is the invoking message.')
.setInvoked('This is the invoked message.')
.setOutputWidget('my-widget')
.setAnnotation('readOnlyHint', true)
.setCallback(input => {
return {
content: [
{
type: 'text',
text: 'Hello from my tool!'
}
]
}
})
);
// Finally, register widgets and start the server
app.registerWidgets().then(() => app.listen());ts
import { Widget } from 'chatgpt.js';
// This is where you define your widget's data
export default new Widget()
.setName('my-widget')
.setDescription('This is my first widget!')
.enableBorder();tsx
// We will use some hooks from @chatgpt.js/react
import { requestDisplayMode, useDisplayMode, useLocale, useMaxHeight, useSafeArea, useTheme, useUserAgent, useWidgetState } from '@chatgpt.js/react';
function Widget() {
const [widgetState, setWidgetState] = useWidgetState();
const theme = useTheme();
const userAgent = useUserAgent();
const locale = useLocale();
const maxHeight = useMaxHeight();
const displayMode = useDisplayMode();
const safeArea = useSafeArea();
return (
<div
style={{
maxHeight: maxHeight ?? 500
}}
>
<h1>My First Widget</h1>
<div>
<button onClick={() => setWidgetState({ thisIsA: 'test' })}>Set Widget State</button>
<button onClick={() => requestDisplayMode('inline')}>Inline{displayMode === 'inline' ? ' (Current)' : ''}</button>
<button onClick={() => requestDisplayMode('pip')}>Picture-in-Picture{displayMode === 'pip' ? ' (Current)' : ''}</button>
<button onClick={() => requestDisplayMode('fullscreen')}>Fullscreen{displayMode === 'fullscreen' ? ' (Current)' : ''}</button>
</div>
<div>
<p>Widget State: {JSON.stringify(widgetState ?? {})}</p>
<p>Theme: {theme}</p>
<p>User Agent: {JSON.stringify(userAgent)}</p>
<p>Locale: {locale}</p>
<p>Max Height: {maxHeight}</p>
<p>Display Mode: {displayMode}</p>
<p>Safe Area: {JSON.stringify(safeArea)}</p>
</div>
</div>
);
};css
body {
background-color: #1a1a1a;
color: #e0e0e0;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;
margin: 0;
padding: 20px;
}
h1 {
color: #ffffff;
margin-top: 0;
}
button {
background-color: #2d2d2d;
color: #e0e0e0;
border: 1px solid #444;
padding: 8px 16px;
margin: 4px;
border-radius: 4px;
cursor: pointer;
font-size: 14px;
}
button:hover {
background-color: #3d3d3d;
}
button:active {
background-color: #4d4d4d;
}
div {
margin-bottom: 16px;
}
p {
margin: 8px 0;
line-height: 1.5;
}Full documentation captured from public sources, including the complete README when available.
Docs source
GITHUB MCP
Editorial quality
ready
Build ChatGPT Apps easily. [!CAUTION] This library is still in early development. Things may change rapidly and there may be bugs. Use at your own risk. Also I would appreciate contributions for the documentation and the library itself! ChatGPT.js A TypeScript/JavaScript library for building ChatGPT Apps easily. It only takes ~30 lines of code to create a simple ChatGPT App with a widget! What does it do? chatgpt.js combines Model Context Prot
[!CAUTION] This library is still in early development. Things may change rapidly and there may be bugs. Use at your own risk.
Also I would appreciate contributions for the documentation and the library itself!
A TypeScript/JavaScript library for building ChatGPT Apps easily. It only takes ~30 lines of code to create a simple ChatGPT App with a widget!
chatgpt.js combines Model Context Protocol, React, Esbuild, Express, and ChatGPT Apps SDK to provide an easy way to build ChatGPT Apps.
npm install chatgpt.js @chatgpt.js/react
@chatgpt.js/react is optional but you will probably need it since it is required unless you want to add widgets manually.
You can use chatgpt.js in many ways, but here is the recommended way to use it:
Project Structure:
my-chatgpt-app/
└── src/
├── index.ts
└── widgets/
└── my-widget/
├── data.ts
├── index.tsx
└── index.css (optional)
src/index.ts
import { App } from 'chatgpt.js';
// Create the app instance, it's as simple as that!
const app = new App({
mcp: {
serverInfo: {
name: 'my-mcp',
version: '1.0.0'
}
},
widgetsDir: 'src/widgets'
});
// Register a tool, this one is also super simple!
app.registerTool(tool => tool
.setName('my_tool')
.setDescription('This is my first tool!')
.setInvoking('This is the invoking message.')
.setInvoked('This is the invoked message.')
.setOutputWidget('my-widget')
.setAnnotation('readOnlyHint', true)
.setCallback(input => {
return {
content: [
{
type: 'text',
text: 'Hello from my tool!'
}
]
}
})
);
// Finally, register widgets and start the server
app.registerWidgets().then(() => app.listen());
widgetsDir is the directory where your widgets (components) are located. Even if you compile your code to a different directory, you don't need to change this path since chatgpt.js automatically handles both TypeScript and JavaScript files. This is recommended to work with CSS files in TypeScript projects.setOutputWidget, make sure the widget name matches the name you set in the widget's data file.setCallback function works the same as how MCP SDK handles it. Read more about it in the MCP documentation.[!IMPORTANT] Each widget folder must have the following files:
data.ts(ordata.js): This file is where you define your widget's data using theWidgetclass fromchatgpt.js.index.tsx(orindex.jsx): This file is where you define your widget's component using React.If you would like to use a CSS file for your widget, it must be named
index.css.chatgpt.jswill automatically handle it for you. (CSS used in the widget's component file will only apply to the component, not the whole widget)
src/widgets/my-widget/data.ts
import { Widget } from 'chatgpt.js';
// This is where you define your widget's data
export default new Widget()
.setName('my-widget')
.setDescription('This is my first widget!')
.enableBorder();
[!IMPORTANT] In the widget's component file,
chatgpt.jsautomatically imports React for you, so it is not recommended to import React again.
src/widgets/my-widget/index.tsx
// We will use some hooks from @chatgpt.js/react
import { requestDisplayMode, useDisplayMode, useLocale, useMaxHeight, useSafeArea, useTheme, useUserAgent, useWidgetState } from '@chatgpt.js/react';
function Widget() {
const [widgetState, setWidgetState] = useWidgetState();
const theme = useTheme();
const userAgent = useUserAgent();
const locale = useLocale();
const maxHeight = useMaxHeight();
const displayMode = useDisplayMode();
const safeArea = useSafeArea();
return (
<div
style={{
maxHeight: maxHeight ?? 500
}}
>
<h1>My First Widget</h1>
<div>
<button onClick={() => setWidgetState({ thisIsA: 'test' })}>Set Widget State</button>
<button onClick={() => requestDisplayMode('inline')}>Inline{displayMode === 'inline' ? ' (Current)' : ''}</button>
<button onClick={() => requestDisplayMode('pip')}>Picture-in-Picture{displayMode === 'pip' ? ' (Current)' : ''}</button>
<button onClick={() => requestDisplayMode('fullscreen')}>Fullscreen{displayMode === 'fullscreen' ? ' (Current)' : ''}</button>
</div>
<div>
<p>Widget State: {JSON.stringify(widgetState ?? {})}</p>
<p>Theme: {theme}</p>
<p>User Agent: {JSON.stringify(userAgent)}</p>
<p>Locale: {locale}</p>
<p>Max Height: {maxHeight}</p>
<p>Display Mode: {displayMode}</p>
<p>Safe Area: {JSON.stringify(safeArea)}</p>
</div>
</div>
);
};
It is not required, but to keep things fancy for your first widget, we'll add some CSS!
src/widgets/my-widget/index.css
body {
background-color: #1a1a1a;
color: #e0e0e0;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;
margin: 0;
padding: 20px;
}
h1 {
color: #ffffff;
margin-top: 0;
}
button {
background-color: #2d2d2d;
color: #e0e0e0;
border: 1px solid #444;
padding: 8px 16px;
margin: 4px;
border-radius: 4px;
cursor: pointer;
font-size: 14px;
}
button:hover {
background-color: #3d3d3d;
}
button:active {
background-color: #4d4d4d;
}
div {
margin-bottom: 16px;
}
p {
margin: 8px 0;
line-height: 1.5;
}
And we're done! Now you can run your app and start using it in ChatGPT.
You can customize various options of the App by passing options to the constructor. Here are some of the available options:
mcpPath: The path where the MCP server will be available. Defaults to /mcp.port: The port where the server will listen on. Defaults to 8000.widgetsDir: The directory where your widgets are located. Defaults to {process.cwd()}/widgets.debug: Enables debug mode. Defaults to false.
index.debug.html for your each widget after they are bundled, in the same directory as the widget.The mcp option in the App constructor acts the same way as how you would configure your MCP server with the MCP TypeScript SDK. You can either pass an McpServer class or simply configure it using the serverInfo and serverOptions options.
McpServer class:import { App } from 'chatgpt.js';
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
const mcp = new McpServer(
{
name: 'my-mcp',
version: '1.0.0'
},
{
debouncedNotificationMethods: [
'notifications/tools/list_changed'
]
}
);
const app = new App({ mcp });
serverInfo and serverOptions:import { App } from 'chatgpt.js';
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
const app = new App({
mcp: {
serverInfo: {
name: 'my-mcp',
version: '1.0.0'
},
serverOptions: {
debouncedNotificationMethods: [
'notifications/tools/list_changed'
]
}
}
});
chatgpt.js uses Express.js to create the server. If you want to customize the server, you can simply pass your own Express instance to the App constructor.
[!WARNING] If your custom server already has an endpoint for the path that's configured as
mcpPath(defaults to/mcp),chatgpt.jswill skip creating the MCP endpoint. If the endpoint is missing, it will be created automatically with the needed handlers.
import { App } from 'chatgpt.js';
import express from 'express';
const customServer = express();
customServer.get('/custom-endpoint', (req, res) => {
// Your custom logic here
});
const app = new App({
mcp: {
serverInfo: {
name: 'my-mcp',
version: '1.0.0'
}
},
server: customServer
});
When you use the registerWidgets method, chatgpt.js automatically scans the widgetsDir for widgets, bundles them, and registers them for you. This process requires @chatgpt.js/react to be installed as currently you can only register widgets that are built with React.
However, if you want to add widgets manually (for example, if you are not using React), you can do so by using the registerWidget method. This method works the same as the registerTool method and the usage is the same as defining the widget's data using the Widget class. The only difference is that you need to pass your own HTML using the setHtml method.
Recommended HTML structure for widgets:
<div id="my-manual-widget-root"></div>
<style>{ Your CSS }</style>
<script type="module">${Your Script}</script>
import { App } from 'chatgpt.js';
const app = new App({
mcp: {
serverInfo: {
name: 'my-mcp',
version: '1.0.0'
}
}
});
app.registerWidget(widget => widget
.setName('my-manual-widget')
.setDescription('This is my manually registered widget!')
.enableBorder()
.setHtml(/* Your HTML */)
);
app.listen();
Machine endpoints, protocol fit, contract coverage, invocation examples, and guardrails for agent-to-agent use.
Contract coverage
Status
ready
Auth
mcp, api_key
Streaming
No
Data region
global
Protocol support
Requires: mcp, lang:typescript
Forbidden: none
Guardrails
Operational confidence: medium
curl -s "https://xpersona.co/api/v1/agents/mcp-tolga1452-chatgpt-js/snapshot"
curl -s "https://xpersona.co/api/v1/agents/mcp-tolga1452-chatgpt-js/contract"
curl -s "https://xpersona.co/api/v1/agents/mcp-tolga1452-chatgpt-js/trust"
Trust and runtime signals, benchmark suites, failure patterns, and practical risk constraints.
Trust signals
Handshake
UNKNOWN
Confidence
unknown
Attempts 30d
unknown
Fallback rate
unknown
Runtime metrics
Observed P50
unknown
Observed P95
unknown
Rate limit
unknown
Estimated cost
unknown
Every public screenshot, visual asset, demo link, and owner-provided destination tied to this agent.
Neighboring agents from the same protocol and source ecosystem for comparison and shortlist building.
Rank
83
A Model Context Protocol (MCP) server for GitLab
Traction
No public download signal
Freshness
Updated 2d ago
Rank
80
A Model Context Protocol (MCP) server for GitLab
Traction
No public download signal
Freshness
Updated 2d ago
Rank
74
Expose OpenAPI definition endpoints as MCP tools using the official Rust SDK for the Model Context Protocol (https://github.com/modelcontextprotocol/rust-sdk)
Traction
No public download signal
Freshness
Updated 2d ago
Rank
72
An actix_web backend for the official Rust SDK for the Model Context Protocol (https://github.com/modelcontextprotocol/rust-sdk)
Traction
No public download signal
Freshness
Updated 2d ago
Contract JSON
{
"contractStatus": "ready",
"authModes": [
"mcp",
"api_key"
],
"requires": [
"mcp",
"lang:typescript"
],
"forbidden": [],
"supportsMcp": true,
"supportsA2a": false,
"supportsStreaming": false,
"inputSchemaRef": "https://github.com/Tolga1452/chatgpt.js#input",
"outputSchemaRef": "https://github.com/Tolga1452/chatgpt.js#output",
"dataRegion": "global",
"contractUpdatedAt": "2026-02-24T19:45:19.834Z",
"sourceUpdatedAt": "2026-02-24T19:45:19.834Z",
"freshnessSeconds": 4422096
}Invocation Guide
{
"preferredApi": {
"snapshotUrl": "https://xpersona.co/api/v1/agents/mcp-tolga1452-chatgpt-js/snapshot",
"contractUrl": "https://xpersona.co/api/v1/agents/mcp-tolga1452-chatgpt-js/contract",
"trustUrl": "https://xpersona.co/api/v1/agents/mcp-tolga1452-chatgpt-js/trust"
},
"curlExamples": [
"curl -s \"https://xpersona.co/api/v1/agents/mcp-tolga1452-chatgpt-js/snapshot\"",
"curl -s \"https://xpersona.co/api/v1/agents/mcp-tolga1452-chatgpt-js/contract\"",
"curl -s \"https://xpersona.co/api/v1/agents/mcp-tolga1452-chatgpt-js/trust\""
],
"jsonRequestTemplate": {
"query": "summarize this repo",
"constraints": {
"maxLatencyMs": 2000,
"protocolPreference": [
"MCP"
]
}
},
"jsonResponseTemplate": {
"ok": true,
"result": {
"summary": "...",
"confidence": 0.9
},
"meta": {
"source": "GITHUB_MCP",
"generatedAt": "2026-04-17T00:06:55.938Z"
}
},
"retryPolicy": {
"maxAttempts": 3,
"backoffMs": [
500,
1500,
3500
],
"retryableConditions": [
"HTTP_429",
"HTTP_503",
"NETWORK_TIMEOUT"
]
}
}Trust JSON
{
"status": "unavailable",
"handshakeStatus": "UNKNOWN",
"verificationFreshnessHours": null,
"reputationScore": null,
"p95LatencyMs": null,
"successRate30d": null,
"fallbackRate": null,
"attempts30d": null,
"trustUpdatedAt": null,
"trustConfidence": "unknown",
"sourceUpdatedAt": null,
"freshnessSeconds": null
}Capability Matrix
{
"rows": [
{
"key": "MCP",
"type": "protocol",
"support": "supported",
"confidenceSource": "contract",
"notes": "Confirmed by capability contract"
},
{
"key": "chatgpt.js",
"type": "capability",
"support": "supported",
"confidenceSource": "profile",
"notes": "Declared in agent profile metadata"
},
{
"key": "openai",
"type": "capability",
"support": "supported",
"confidenceSource": "profile",
"notes": "Declared in agent profile metadata"
},
{
"key": "chatgpt",
"type": "capability",
"support": "supported",
"confidenceSource": "profile",
"notes": "Declared in agent profile metadata"
},
{
"key": "app",
"type": "capability",
"support": "supported",
"confidenceSource": "profile",
"notes": "Declared in agent profile metadata"
},
{
"key": "application",
"type": "capability",
"support": "supported",
"confidenceSource": "profile",
"notes": "Declared in agent profile metadata"
},
{
"key": "sdk",
"type": "capability",
"support": "supported",
"confidenceSource": "profile",
"notes": "Declared in agent profile metadata"
},
{
"key": "npm",
"type": "capability",
"support": "supported",
"confidenceSource": "profile",
"notes": "Declared in agent profile metadata"
},
{
"key": "package",
"type": "capability",
"support": "supported",
"confidenceSource": "profile",
"notes": "Declared in agent profile metadata"
},
{
"key": "node",
"type": "capability",
"support": "supported",
"confidenceSource": "profile",
"notes": "Declared in agent profile metadata"
},
{
"key": "js",
"type": "capability",
"support": "supported",
"confidenceSource": "profile",
"notes": "Declared in agent profile metadata"
},
{
"key": "javascript",
"type": "capability",
"support": "supported",
"confidenceSource": "profile",
"notes": "Declared in agent profile metadata"
},
{
"key": "ts",
"type": "capability",
"support": "supported",
"confidenceSource": "profile",
"notes": "Declared in agent profile metadata"
},
{
"key": "typescript",
"type": "capability",
"support": "supported",
"confidenceSource": "profile",
"notes": "Declared in agent profile metadata"
}
],
"flattenedTokens": "protocol:MCP|supported|contract capability:chatgpt.js|supported|profile capability:openai|supported|profile capability:chatgpt|supported|profile capability:app|supported|profile capability:application|supported|profile capability:sdk|supported|profile capability:npm|supported|profile capability:package|supported|profile capability:node|supported|profile capability:js|supported|profile capability:javascript|supported|profile capability:ts|supported|profile capability:typescript|supported|profile"
}Facts JSON
[
{
"factKey": "docs_crawl",
"category": "integration",
"label": "Crawlable docs",
"value": "6 indexed pages on the official domain",
"href": "https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fopenclaw%2Fskills%2Ftree%2Fmain%2Fskills%2Fasleep123%2Fcaldav-calendar",
"sourceUrl": "https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fopenclaw%2Fskills%2Ftree%2Fmain%2Fskills%2Fasleep123%2Fcaldav-calendar",
"sourceType": "search_document",
"confidence": "medium",
"observedAt": "2026-04-15T05:03:46.393Z",
"isPublic": true
},
{
"factKey": "protocols",
"category": "compatibility",
"label": "Protocol compatibility",
"value": "MCP",
"href": "https://xpersona.co/api/v1/agents/mcp-tolga1452-chatgpt-js/contract",
"sourceUrl": "https://xpersona.co/api/v1/agents/mcp-tolga1452-chatgpt-js/contract",
"sourceType": "contract",
"confidence": "high",
"observedAt": "2026-02-24T19:45:19.834Z",
"isPublic": true
},
{
"factKey": "auth_modes",
"category": "compatibility",
"label": "Auth modes",
"value": "mcp, api_key",
"href": "https://xpersona.co/api/v1/agents/mcp-tolga1452-chatgpt-js/contract",
"sourceUrl": "https://xpersona.co/api/v1/agents/mcp-tolga1452-chatgpt-js/contract",
"sourceType": "contract",
"confidence": "high",
"observedAt": "2026-02-24T19:45:19.834Z",
"isPublic": true
},
{
"factKey": "schema_refs",
"category": "artifact",
"label": "Machine-readable schemas",
"value": "OpenAPI or schema references published",
"href": "https://github.com/Tolga1452/chatgpt.js#input",
"sourceUrl": "https://xpersona.co/api/v1/agents/mcp-tolga1452-chatgpt-js/contract",
"sourceType": "contract",
"confidence": "high",
"observedAt": "2026-02-24T19:45:19.834Z",
"isPublic": true
},
{
"factKey": "vendor",
"category": "vendor",
"label": "Vendor",
"value": "Tolga1452",
"href": "https://github.com/Tolga1452/chatgpt.js#readme",
"sourceUrl": "https://github.com/Tolga1452/chatgpt.js#readme",
"sourceType": "profile",
"confidence": "medium",
"observedAt": "2026-02-24T19:43:14.176Z",
"isPublic": true
},
{
"factKey": "traction",
"category": "adoption",
"label": "Adoption signal",
"value": "4 GitHub stars",
"href": "https://github.com/Tolga1452/chatgpt.js",
"sourceUrl": "https://github.com/Tolga1452/chatgpt.js",
"sourceType": "profile",
"confidence": "medium",
"observedAt": "2026-02-24T19:43:14.176Z",
"isPublic": true
},
{
"factKey": "handshake_status",
"category": "security",
"label": "Handshake status",
"value": "UNKNOWN",
"href": "https://xpersona.co/api/v1/agents/mcp-tolga1452-chatgpt-js/trust",
"sourceUrl": "https://xpersona.co/api/v1/agents/mcp-tolga1452-chatgpt-js/trust",
"sourceType": "trust",
"confidence": "medium",
"observedAt": null,
"isPublic": true
}
]Change Events JSON
[
{
"eventType": "docs_update",
"title": "Docs refreshed: Sign in to GitHub · GitHub",
"description": "Fresh crawlable documentation was indexed for the official domain.",
"href": "https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fopenclaw%2Fskills%2Ftree%2Fmain%2Fskills%2Fasleep123%2Fcaldav-calendar",
"sourceUrl": "https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fopenclaw%2Fskills%2Ftree%2Fmain%2Fskills%2Fasleep123%2Fcaldav-calendar",
"sourceType": "search_document",
"confidence": "medium",
"observedAt": "2026-04-15T05:03:46.393Z",
"isPublic": true
}
]Sponsored
Ads related to chatgpt.js and adjacent AI workflows.