campaign-creator-provider
# Campaign Creator Provider
Independent, local-first TypeScript provider that creates a bilingual campaign strategy, channel copy, and publishing calendar from a URL and an objective. It exposes a typed library API, an MCP-shaped JSON-RPC stdio contract, and a small HTTP API deployed on Vercel.
- Live API: <https://campaign-creator-provider.vercel.app>
- Health: <https://campaign-creator-provider.vercel.app/health>
- Repository: <https://github.com/CaBsCrypto/campaign-creator-provider>
The provider generates deterministic fixture content. It does not fetch the submitted URL, call external services, publish content, persist inputs, or interact with Stellar Bazaar.
## Features
- Spanish (`es`, default) and English (`en`) output
- Strategy, channel copy, and a configurable 1–30 day calendar
- X, LinkedIn, Instagram, and email channels
- JSON Schema tool definition and structured validation errors
- HTTP, TypeScript, and MCP-shaped stdio entrypoints over one generator
- Network-free deterministic generation
- Apache-2.0 licensed
## HTTP API
### Discovery
```bash
curl https://campaign-creator-provider.vercel.app/
```
### Health
```bash
curl https://campaign-creator-provider.vercel.app/health
```
### Create a campaign
```bash
curl -X POST https://campaign-creator-provider.vercel.app/api/campaign \
-H "content-type: application/json" \
-d '{"url":"https://example.com/product","objective":"Increase qualified sign-ups","locale":"en","days":7,"channels":["linkedin","email"]}'
```
Required fields are `url` (an absolute HTTP/HTTPS URL) and `objective`. Optional fields are:
| Field | Type | Default | Constraints |
| --- | --- | --- | --- |
| `locale` | `"es" \| "en"` | `"es"` | Supported output language |
| `days` | integer | `7` | 1–30 |
| `channels` | array | all channels | One or more of `x`, `linkedin`, `instagram`, `email` |
| `audience` | string | localized fixture | Non-empty |
Successful requests return the campaign object directly with HTTP 200. Invalid inputs return HTTP 400 and a stable JSON error object containing validation issues. Routes support CORS and do not cache responses.
## TypeScript API
```ts
import { createCampaign } from "@stellar-bazaar/campaign-creator-provider";
const campaign = createCampaign({
url: "https://example.com/product",
objective: "Increase qualified sign-ups",
locale: "en",
days: 7,
channels: ["linkedin", "email"]
});
```
The returned `CampaignPlan` contains `strategy`, `copy`, `calendar`, source context, and fixture metadata.
## MCP-shaped stdio contract
The built server accepts one JSON-RPC 2.0 object per line on stdin and writes one response per line on stdout. It implements `initialize`, `tools/list`, `tools/call`, and `notifications/initialized`.
```bash
echo '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"create_campaign","arguments":{"url":"https://example.com","objective":"Aumentar registros","locale":"es"}}}' | node dist/server.js
```
The `create_campaign` result includes MCP text content and the same campaign in `structuredContent`. Invalid arguments return `isError: true` with structured validation issues. See [`service-card.json`](./service-card.json) for discovery metadata.
## Local development
Node.js 22.6 or newer is required.
```bash
npm ci
npm run test:all
```
`test:all` type-checks both the library and Vercel handlers, runs the test suite, and builds the distributable package.
## Deploy a separate Vercel project
With the Vercel CLI authenticated:
```bash
vercel link --project campaign-creator-provider
vercel deploy --prod
```
The tracked [`vercel.json`](./vercel.json) explicitly builds the three serverless entrypoints. Vercel’s local `.vercel/` link metadata is ignored and must never be committed.
## Fixture boundary
The URL is used only as campaign context and is never requested. Identical normalized inputs produce identical output, including `campaignId` and `generatedAt`. Copy is generic fixture material, not a claim that the referenced site was analyzed.
This repository and deployment are independent. They do not register with or modify Stellar Bazaar.
## License
Apache License 2.0. See [`LICENSE`](./LICENSE).
TDQS
Scored across 1 tool
Only one tool is exposed, so there is no possibility of selecting between overlapping operations. The purpose is immediately clear and unambiguous.
The sole tool uses a clean snake_case verb_noun name, create_campaign, which follows common MCP naming conventions. With a single tool, consistency is trivially maintained.
A single tool is on the thin side for a general-purpose server, but create_campaign is a substantial atomic operation that directly covers the provider's stated purpose. It is borderline rather than excessive or trivial.
The tool fully delivers the advertised campaign plan, copy set, and calendar generation in one deterministic action. Broader lifecycle operations like list, update, or delete are absent, but they appear outside the scope of a campaign creator.