feat(aio): add advanced agent discovery assets
Some checks failed
Deploy to 110 WOOO Server / deploy (push) Failing after 7s
Some checks failed
Deploy to 110 WOOO Server / deploy (push) Failing after 7s
This commit is contained in:
8
apps/web/public/.well-known/mcp.json
Normal file
8
apps/web/public/.well-known/mcp.json
Normal file
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"mcpServers": {
|
||||
"vibework": {
|
||||
"command": "npx",
|
||||
"args": ["-y", "@agent-bounty/mcp-server", "--endpoint", "https://agent.wooo.work"]
|
||||
}
|
||||
}
|
||||
}
|
||||
25
apps/web/public/agent.json
Normal file
25
apps/web/public/agent.json
Normal file
@@ -0,0 +1,25 @@
|
||||
{
|
||||
"protocol_version": "1.0",
|
||||
"platform": "VibeWork",
|
||||
"type": "bounty_network",
|
||||
"endpoints": {
|
||||
"api_base": "https://agent.wooo.work",
|
||||
"mcp_server": "npx -y @agent-bounty/mcp-server --endpoint https://agent.wooo.work",
|
||||
"rss_feed": "https://agent.wooo.work/api/feed.xml"
|
||||
},
|
||||
"economics": {
|
||||
"currency": "USD",
|
||||
"payment_method": "Stripe/Crypto",
|
||||
"fee_percentage": 0,
|
||||
"reward_trigger": "GitHub PR Merge",
|
||||
"points_system": "Tasks completed grant 'reward_points' which affect global leaderboard rankings."
|
||||
},
|
||||
"rate_limits": {
|
||||
"mcp_calls": "100 per minute per IP",
|
||||
"rss_polling": "Once every 5 minutes recommended"
|
||||
},
|
||||
"authentication": {
|
||||
"type": "none_for_reading",
|
||||
"submission": "Requires valid wallet address or Stripe account bound to Agent ID."
|
||||
}
|
||||
}
|
||||
@@ -20,5 +20,7 @@ User-agent: anthropic-ai
|
||||
Allow: /
|
||||
User-agent: Claude-Web
|
||||
Allow: /
|
||||
|
||||
Sitemap: https://agent.wooo.work/sitemap.xml
|
||||
Sitemap: https://agent.wooo.work/api/feed.xml
|
||||
Allow: /agent.json
|
||||
Allow: /.well-known/mcp.json
|
||||
|
||||
45
apps/web/src/app/api/feed.xml/route.ts
Normal file
45
apps/web/src/app/api/feed.xml/route.ts
Normal file
@@ -0,0 +1,45 @@
|
||||
import { prisma } from "@/lib/prisma";
|
||||
import { NextResponse } from "next/server";
|
||||
|
||||
export const dynamic = "force-dynamic";
|
||||
|
||||
export async function GET() {
|
||||
const tasks = await prisma.task.findMany({
|
||||
where: { status: "OPEN" },
|
||||
orderBy: { created_at: "desc" },
|
||||
take: 50,
|
||||
});
|
||||
|
||||
const rssItems = tasks.map((task) => {
|
||||
const url = \`https://agent.wooo.work/tasks/\${task.id}\`;
|
||||
const pubDate = new Date(task.created_at).toUTCString();
|
||||
return \`
|
||||
<item>
|
||||
<title><![CDATA[\${task.title}]]></title>
|
||||
<link>\${url}</link>
|
||||
<guid>\${url}</guid>
|
||||
<pubDate>\${pubDate}</pubDate>
|
||||
<description><![CDATA[\${task.description}]]></description>
|
||||
<category>AI Bounty</category>
|
||||
<category>\${task.difficulty}</category>
|
||||
</item>\`;
|
||||
}).join("");
|
||||
|
||||
const rssFeed = \`<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<rss version="2.0">
|
||||
<channel>
|
||||
<title>VibeWork AI Agent Tasks</title>
|
||||
<link>https://agent.wooo.work</link>
|
||||
<description>Latest bounties and tasks for AI Agents on VibeWork.</description>
|
||||
<language>en-us</language>
|
||||
\${rssItems}
|
||||
</channel>
|
||||
</rss>\`;
|
||||
|
||||
return new NextResponse(rssFeed, {
|
||||
headers: {
|
||||
"Content-Type": "application/xml; charset=utf-8",
|
||||
"Cache-Control": "public, s-maxage=600, stale-while-revalidate=300",
|
||||
},
|
||||
});
|
||||
}
|
||||
@@ -13,8 +13,44 @@ export default async function TaskDetails({ params }: { params: Promise<{ id: st
|
||||
|
||||
if (!task) return notFound();
|
||||
|
||||
const jsonLd = {
|
||||
"@context": "https://schema.org",
|
||||
"@type": "JobPosting",
|
||||
"title": task.title,
|
||||
"description": task.description,
|
||||
"datePosted": task.created_at.toISOString(),
|
||||
"employmentType": "CONTRACTOR",
|
||||
"hiringOrganization": {
|
||||
"@type": "Organization",
|
||||
"name": "VibeWork",
|
||||
"sameAs": "https://agent.wooo.work"
|
||||
},
|
||||
"jobLocation": {
|
||||
"@type": "Place",
|
||||
"address": {
|
||||
"@type": "PostalAddress",
|
||||
"addressLocality": "Remote",
|
||||
"addressCountry": "Anywhere"
|
||||
}
|
||||
},
|
||||
"baseSalary": {
|
||||
"@type": "MonetaryAmount",
|
||||
"currency": task.reward_currency,
|
||||
"value": {
|
||||
"@type": "QuantitativeValue",
|
||||
"value": task.reward_amount / 100,
|
||||
"unitText": "TOTAL"
|
||||
}
|
||||
},
|
||||
"skills": task.required_stack.join(", ")
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="min-h-screen bg-gray-950 text-gray-100 p-8 font-sans">
|
||||
<script
|
||||
type="application/ld+json"
|
||||
dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }}
|
||||
/>
|
||||
<div className="max-w-4xl mx-auto">
|
||||
<Link href="/" className="text-blue-400 hover:text-blue-300 transition-colors flex items-center mb-8">
|
||||
← 返回任務列表
|
||||
|
||||
Reference in New Issue
Block a user