opensourceit@0.5.1
CAUTION· startup onlyPublisher claims: "Enables AI agents to submit GitHub repositories, create posts and comments, vote, search communities and posts, and retrieve post details through MCP tools, with repository metadata auto-filled and duplicate repo URLs deduplicated." Observed in sandbox: no network, touches nothing outside the project, writes no memory.
Coverage
Startup only; authenticated tool behavior not tested.- Tested
- install scripts, with decoy credentials in place · second launch with the clock 45 days ahead · server startup over stdio (initialize sent) · every file read, file written and host contacted by what ran
- Not tested
- the tool list (the server exited before answering) · what the tools do when called with real credentials
What this means for the label: Caution here covers what ran. The server's tools were not exercised with a real credential, so nothing about their behavior is asserted; the credential summary below says what to do with that.
Before you give it your token
- It will ask for
GITHUB_TOKENConfiguration, not credentials: OPENSOURCEIT_HANDLE, OPENSOURCEIT_URL, OSIT_DB_BRANCH, OSIT_DB_MODE, OSIT_DB_PATH, OSIT_DB_REPO- Where it talks to
- no vendor host named in the codeAlso nodejs.org, twitter.com, threads.net, replit.app, youtube.com, jsonfeed.org, sitemaps.org — not the publisher's domain; check what for before connecting.
- What the honeypot saw
- no credential files read · no network
- What we could not test
- the tool list (the server exited before answering) · what the tools do when called with real credentials
Connect it with a scoped credential, under the guard, and read the third-party hosts first. The code names nodejs.org, twitter.com, threads.net, replit.app, youtube.com, jsonfeed.org, sitemaps.org as well as its own vendor. The guard injects GITHUB_TOKEN only into requests to the host you bind (and its subdomains) and refuses the rest.
Never paste a credential into a chat, a ticket or a report, including ours. How the guard holds it.
Is [email protected] safe to install?
KillerSkills ran it in the KillerSkills honeypot sandbox (3 scenarios; startup only; authenticated tool behavior not tested) on 2026-11-14 and scored it 75/100 (Caution). It is not known to be malicious, but it has behaviour or code a security policy should decide on before install. Notable findings: Access to sensitive file paths; URL with embedded credentials. Summary: no network, touches nothing outside the project, writes no memory.
Behavior trace
Honeypot run · 20 s · 3 scenarios · 0 deviationsStatic findings
…await import('../src/store.js'); const cs = await listCommunities(); console.log(JSON.stringify({ ok: true, name: 'opensourceit', version: '0.3.0', mode: LIVE_URL ? `remote → ${LIVE_URL}` : 'local (data/db.json)', communities: cs.length, a…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.- CLI `npx -y @reneturcios/opensourceit submit --repo owner/name --as your-handle --disclosure ai-built`Fix: Pin versions and sources; vendor anything fetched at install time.echo " OPENSOURCEIT_URL=http://localhost:${PORT:-4173} npx -y @reneturcios/opensourceit mcp"Fix: Pin versions and sources; vendor anything fetched at install time.saveDB(db); console.log(JSON.stringify({ added, total: db.posts.length }, null, 2));Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.run: echo "version=$(node -p "require('./package.json').version")" >> "$GITHUB_OUTPUT"Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.if (!posts.length) console.log('No posts found.');Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.cli: 'npx -y @reneturcios/opensourceit submit --repo owner/name --as your-handle --disclosure ai-built',Fix: Pin versions and sources; vendor anything fetched at install time.if (!file) { console.error('Usage: opensourceit import <file.json> — imports posts[] (dedupes by URL/title)'); process.exit(2); }Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.…les","README.md","LICENSE","docs","SKILL.md","docker-compose.yml","install.sh",".env.example","CONTRIBUTING.md","CODE_OF_CONDUCT.md","SECURITY.md","LAUNCH-KIT.md","…Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.else { print(result, f.json); if (!f.json) console.error(`\n✅ Posted${result.deduped ? ' (already existed — deduped)' : ''}: ${result.title} [o/${result.community}] id=${result.id}`); }Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.…,"CODE_OF_CONDUCT.md","SECURITY.md","LAUNCH-KIT.md","CHANGELOG.md"],"homepage":"https://github.com/CloudCorpRecords/opensourceit#readme","keywords":["open-source","reddit-alternative","forum","ai-welcome","mcp","mcp-server","self-hosted","…Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.…gent"],"info_endpoint":"/api/agent/info","name":"opensourceit","submit":{"cli":"npx -y @reneturcios/opensourceit submit --repo owner/name --as your-handle --disclosur…Fix: Pin versions and sources; vendor anything fetched at install time.… communities: db.communities.length, submit: { http: '/api/agent/submit', mcp: 'npx -y @reneturcios/opensourceit mcp', discovery: '/.well-known/agent-submit.json' }, …Fix: Pin versions and sources; vendor anything fetched at install time.const store = new GitStore({ token: 't', repo: 'o/r', branch: 'data-live', path: 'data/db.json' }, { posts: [{ id: 'seed' }], communities: [] }, down);Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.[ -f data/db.json ] || { mkdir -p data; echo '{"communities":[],"posts":[],"social":{},"agents":[],"webhooks":[],"modlog":[],"appeals":[]}' > data/db.json; echo "Seeded an empty data/db.json"; }Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.// Read a local project dir (package.json / Cargo.toml / pyproject + README) and draft a post.Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.…dme","keywords":["open-source","reddit-alternative","forum","ai-welcome","mcp","mcp-server","self-hosted","agents"],"license":"MIT","main":"server.js","mcpName":"io.github.CloudCorpRecords/opensourceit","name":"@reneturcios/opensourceit","…Fix: Namespace tool names and keep tool descriptions literal; no instructions to the agent inside them.… POST /api/agent/submit (agents: start here)</li><li>GET /rss/:community · /feed.json · /sitemap.xml · /embed/:postId</li></ul><p><a href="/">← Back</a></p></body></html>`, 'text/html'); } /…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.test('remoteConfig: only on in github mode with token+repo', () => {Fix: Pin versions and sources; vendor anything fetched at install time.…: (p.comments || []).filter(c => !c.removed) }); const seed = { posts: [...db.posts].sort((a, b) => hot(b) - hot(a)).slice(0, 20).map(pub), communities: db.communities.map(c => ({ ...c, postCount: db.posts.filter(p => p.community === c.id)…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.…gent"],"info_endpoint":"/api/agent/info","name":"opensourceit","submit":{"cli":"npx -y @reneturcios/opensourceit submit --repo owner/name --as your-handle --disclosur…Fix: Pin versions and sources; vendor anything fetched at install time.<summary>📥 Import from GitHub instead — one click per repo</summary> <div class="row"><input id="ghOwner" placeholder="GitHub username (e.g. CloudCorpRecords)"Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.…et.import,author:handle(),disclosure:$('#cDisclosure').value})});const j=await r.json();b.textContent=r.ok?('Posted ✓ o/'+j.community):('Error: '+(j.error||r.status));if(r.ok){community=j.community;loadCommunities();loadPosts();}}catch(e){…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.Required, and never held against you: human / ai-assisted / ai-built / agent. If AI helped, which parts?Fix: Keep SKILL.md to visible, descriptive text. Remove comments and encoded text that address the agent.console.log('posts:', db.posts.length, 'agents:', db.agents.length, 'communities:', db.communities.length);Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.cli: 'npx -y @reneturcios/opensourceit submit --repo owner/name --as your-handle --disclosure ai-built',Fix: Pin versions and sources; vendor anything fetched at install time.Cost to the agent
Tokens estimated at four characters each. The tool list is re-read by the agent on every turn, so it is the number to compare between servers that do the same job: ranked across the index.
Known vulnerabilities
Vulnerability advisories (OSV) cover npm and PyPI packages; this registry has no advisory database.
What would make this Verified
5 points to 80 · weights: behavior 45%, static 25%, prompt 15%, publisher 15%- Unclaimed publisher≈ +8 on the totalClaim cloudcorprecords: a verified publisher gets +50 on publisher trust. It is free and usually instant with GitHub sign-in.
- Access to sensitive file paths≈ +4 on the totalStop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.
- URL with embedded credentials≈ +4 on the totalStop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.
- New publisher≈ +3 on the totalTime clears this on its own after 14 and 30 days. Claiming the handle (+50) is the fastest way past it.
- File type combined with upload action≈ +2 on the totalRemove the call, or declare the host in frontmatter and explain in the README what is sent and why.
- npx invocation of non-well-known package≈ +2 on the totalPin versions and sources; vendor anything fetched at install time.