Cloudflare Logging

A server for logging, deployable as a Cloudflare Worker.

Setup

  • Start up container

    docker compose up -d

  • Initialize package.json
    • npm init -y (First time to create package.json)

    • npm install

MCP Server Creation

  • Create from CF template
    • npm create cloudflare@latest -- mcp-logging --template=cloudflare/ai/demos/remote-mcp-authless

    • If clone template failed, git clone cloudflare/ai repo below, then recreate

      git clone https://github.com/cloudflare/ai.git

  • Start dev server
    • Update to use wrangler dev --ip 0.0.0.0 IP in package.json
    • Port mapping 8787:8787 in docker-compose.yml
    • npm start OR wrangler dev --ip 0.0.0.0
    • Access via localhost:8787/sse

Deploy CF Worker

  • Set CF account ID to wrangler.jsonc

    "account_id": "<EDIT-HERE>"

  • Set CF API key in env
    • API's permission template: Edit Cloudflare Workers
    • ENV: CLOUDFLARE_API_TOKEN=<EDIT-HERE>
  • Deploy worker to CF
    • npm run deploy OR npx wrangler deploy

MCP Inspector

  • Start inspector

    npx @modelcontextprotocol/inspector@latest

Connect via MCP Host/Client

  • mcp-remote

    {
      "mcpServers": {
        "CF Remote MCP": {
          "command": "npx",
          "args": [
            "-y",
            "mcp-remote",
            "https://<MCP_SERVER_URL>/sse"
          ]
        }
      }
    }
    
  • supergateway

    {
      "mcpServers": {
        "Basic Calculator": {
          "command": "npx",
          "args": [
            "-y",
            "supergateway",
            "--sse",
            "http://localhost:8787/sse",
            "--header",
            "X-UserID:USERID_123",
            "--header",
            "X-SecretKey:SKEY_456"
          ]
        }
      }
    }
    

LogPush

  • Enable logpush for CF worker
    • Set "logpush": true in wrangler.jsonc
    • Deploy to CF & check settings

Screenshot

  • Create R2 API token

Screenshot

  • Create R2 bucket

Screenshot

  • Create LogPush job

Screenshot Screenshot Screenshot Screenshot Screenshot

  • Set env (edit the value)
R2_BUCKET_NAME="EDIT: R2 BUCKET NAME"
R2_LOG_BASE_PREFIX="EDIT: R2 FOLDER NAME"
CF_R2_ACCESS_KEY_ID="EDIT: R2 ACCESS KEY ID"
CF_R2_SECRET_ACCESS_KEY="EDIT: R2 ACCESS SECRET"
  • Run utils/download_r2_logs.js script to get logs
    • node utils/download_r2_logs.js --start-date "2025-06-27 07:00:00" --end-date "2025-06-27 08:00:00"

Pass Variable to Tool Function

  • Set ctx.props in fetch entrypoint.

    export default {
    	fetch(request: Request, env: Env, ctx: ExecutionContext) {
    		const userId: string | null = request.headers.get('X-UserID');
    		const secretKey: string | null  = request.headers.get('X-SecretKey');
    		ctx.props = { userId, secretKey }; // add this
    
  • Use this.props.<VARIABLE_NAME> in tool.

    this.server.tool(
        "calculate",
        {
            operation: z.enum(["add", "subtract", "multiply", "divide"]),
            a: z.number(),
            b: z.number()
        },
        async ({ operation, a, b,}) => {
            try {
                // retrieve here
                const userId: string | null = this.props.userId as string;
                const secretKey: string | null  = this.props.secretKey as string;
    

Máy chủ liên quan

NotebookLM Web Importer

Nhập trang web và video YouTube vào NotebookLM chỉ với một cú nhấp. Được tin dùng bởi hơn 200.000 người dùng.

Cài đặt tiện ích Chrome