Sell globally. Grow your revenue.
Sell globally. Grow your revenue. Card and monthly payments for freelancers, agencies and SaaS from 190+ countries, with tax and invoices handled. No company needed.
Let ChatGPT create a smart grocery list or meal plan with up-to-date Picnic deals via kortingzoeker.com.
AI translation
Laat ChatGPT een slimme boodschappenlijst of maaltijdplan maken met actuele Picnic-deals via kortingzoeker.com.
CommercePython · TypeScriptGitHub @dmitrykvochkinOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
Small Python/uv project for starting a Genymotion virtual Android device in
the cloud using Genymotion's supported gmsaas CLI.
Create an API token in Genymotion SaaS and export it without committing it:
Find the recipe you want to launch:
The device is automatically limited to 60 minutes. Override this and connect
ADB when needed:
You can also invoke the Python script directly through uv:
To avoid passing the recipe each time, set GENYMOTION_RECIPE_UUID.
Run the FastMCP server locally with the default stdio transport:
You can also run it through the FastMCP CLI:Read the full README ↗Small Python/uv project for starting a Genymotion virtual Android device in
the cloud using Genymotion's supported gmsaas CLI.
Install the optional Genymotion tooling:
uv sync --extra genymotion
Create an API token in Genymotion SaaS and export it without committing it:
export GENYMOTION_API_TOKEN="your-token"
Find the recipe you want to launch:
uv run gmsaas recipes list
uv run genymotion-cloud <recipe-uuid>
The device is automatically limited to 60 minutes. Override this and connect ADB when needed:
uv run genymotion-cloud <recipe-uuid> \
--name groceries-test \
--max-run-duration 30 \
--adb-connect
You can also invoke the Python script directly through uv:
uv run scripts/run_genymotion.py <recipe-uuid>
To avoid passing the recipe each time, set GENYMOTION_RECIPE_UUID.
Install the locked project dependencies:
uv sync
Run the FastMCP server locally with the default stdio transport:
cp .env.example .env
# Fill in ANONYMOUS_KEY_SECRET, POSTHOG_PROJECT_TOKEN, and POSTHOG_HOST.
uv run groceries-mcp
You can also run it through the FastMCP CLI:
uv run fastmcp run src/groceriesdeals/mcp_server.py:mcp
For an HTTP server instead, run:
uv run fastmcp run src/groceriesdeals/mcp_server.py:mcp \
--transport http \
--port 8438
The HTTP MCP endpoint is http://localhost:8438/mcp. The v1 server exposes:
list_supermarkets — currently returns Picnic onlyget_current_discounts(supermarket_id, category?) — active deals for a
supermarket (optional Picnic category filter such as fruit)The installed project also provides an HTTP entry point intended for
containers. Its bind address, port, and MCP path can be overridden with
MCP_HOST, MCP_PORT, and MCP_PATH:
uv run groceries-mcp-http
The repository includes a production image, Docker Compose stack, Caddy HTTPS proxy, GHCR publishing workflow, and immutable release script. The MCP server has no database dependency; usage analytics are sent to PostHog.
Follow the complete AWS Lightsail deployment guide.
Connect to the Lightsail instance over SSH:
ssh -i ~/.ssh/LightsailDefaultKey.pem [email protected]
The server writes one-line JSON audit records for every MCP request, response, and error. Request records include:
_meta, including a client-provided client_id when present;Authorization headers, cookies, passwords, secrets, and token-shaped fields are
redacted. The bearer token itself is never logged. v1 is intentionally
unauthenticated so any MCP client can call the deals tools. When ChatGPT sends
openai/subject, it is hashed for PostHog analytics only and is not treated as
proof of identity. Client names, user agents, forwarded headers, and request
_meta are client assertions.
Audit output is emitted to stderr both from the groceries-mcp entry point and
when the server is launched through the FastMCP CLI.
The server sends sanitized PostHog events through the Python server SDK. Normal
MCP operations use mcp message processed; tool calls use the dedicated mcp tool called event so they are visible in Activity. Events include MCP operation
names, safe component names, outcome, duration, client/protocol versions, and
UUIDv7 activity session IDs. Tool calls also include tool_name, bounded
tool_parameters, a UI-friendly tool_parameters_json string, and a canonical
tool_call string combining the name and parameters for breakdowns. Keys that
look like passwords, tokens, secrets, credentials, email addresses, phone
numbers, or private keys are replaced with [REDACTED]. Results, complete
headers, raw metadata, IP addresses, raw openai/subject values, and error
messages are never included.
The server reads openai/subject from request metadata or the ChatGPT
x-openai-subject header when present, HMACs it into a stable PostHog distinct
ID, and rejects conflicting identities within one connection.
ANONYMOUS_KEY_SECRET must remain unchanged across deployments or the same
subject will derive a new ID. Events without either identity source use a
connection-scoped anonymous identity; tool calls work without a subject.
PostHog delivery is best-effort after startup and cannot interrupt MCP traffic.
To analyze usage in PostHog, select mcp tool called, count events for total
calls, count unique users for callers, and break down by tool_name. Break down
by tool_call for exact tool-plus-parameter combinations, or inspect/query
tool_parameters and tool_parameters_json. Filter identity_status = stable_user when anonymous pre-identity traffic should not count as a user.
Start the HTTP server from the repository root:
uv run fastmcp run src/groceriesdeals/mcp_server.py:mcp \
--transport http \
--port 8438
Keep that process running. In another terminal, add its URL to Codex:
codex mcp add groceries-deals --url http://localhost:8438/mcp
Confirm that the server was added:
codex mcp list
Restart Codex after adding the server. In a Codex conversation, use /mcp to
check that groceries-deals is connected and that list_supermarkets /
get_current_discounts are available.
The equivalent entry in ~/.codex/config.toml is:
[mcp_servers."groceries-deals"]
url = "http://localhost:8438/mcp"
The Codex desktop app and IDE extension also provide an MCP servers
settings screen. Choose Streamable HTTP and enter
http://localhost:8438/mcp.
The URL works only while the HTTP server process is running. If Codex should
start and stop the server automatically instead, configure it as a local
stdio server:
codex mcp add groceries-deals -- \
uv --directory "$PWD" run groceries-mcp
To remove the server later:
codex mcp remove groceries-deals
Start the MCP HTTP server and landing site together:
make up
http://localhost:8438/mcphttp://localhost:3438Stop both processes with Ctrl+C.
The marketing landing page is a standalone Next.js app in apps/landing
(kortingzoeker.com), including /privacy, /terms, and /support.
cd apps/landing
npm install
npm run dev
Generate the uploadable plugin ZIP and unpacked package:
make plugin-package
Source metadata and review cases live in submission/. See
submission/README.md.
Important technical decisions are recorded in
docs/adr.