<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: ANDY MICHAEL CALIZAYA LADERA</title>
    <description>The latest articles on DEV Community by ANDY MICHAEL CALIZAYA LADERA (@andy_michaelcalizayalad).</description>
    <link>https://dev.to/andy_michaelcalizayalad</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3326143%2Ff487cc11-7b8c-442b-a5fa-87e9c6bba73c.png</url>
      <title>DEV Community: ANDY MICHAEL CALIZAYA LADERA</title>
      <link>https://dev.to/andy_michaelcalizayalad</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/andy_michaelcalizayalad"/>
    <language>en</language>
    <item>
      <title>Building and Deploying a Remote MCP Server to Google Cloud Run in Under 10 Minutes</title>
      <dc:creator>ANDY MICHAEL CALIZAYA LADERA</dc:creator>
      <pubDate>Fri, 28 Nov 2025 02:13:17 +0000</pubDate>
      <link>https://dev.to/andy_michaelcalizayalad/building-and-deploying-a-remote-mcp-server-to-google-cloud-run-in-under-10-minutes-30al</link>
      <guid>https://dev.to/andy_michaelcalizayalad/building-and-deploying-a-remote-mcp-server-to-google-cloud-run-in-under-10-minutes-30al</guid>
      <description>&lt;h2&gt;
  
  
  Unlock the Power of Model Context Protocol with Serverless Architecture
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;Model Context Protocol (MCP)&lt;/strong&gt; is revolutionizing how AI applications connect to external data sources and tools. If you're looking to build your own MCP server and deploy it efficiently, Google Cloud Run offers a perfect serverless solution. Here's how you can go from zero to deployed in under 10 minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is MCP?
&lt;/h2&gt;

&lt;p&gt;MCP is an open protocol that enables AI models like Claude to connect securely to external resources such as databases, APIs, and tools. Unlike traditional plugins, MCP provides a standardized way for models to discover and use capabilities without hard-coded integrations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before we begin, ensure you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A Google Cloud account&lt;/li&gt;
&lt;li&gt;Node.js 18+ installed locally&lt;/li&gt;
&lt;li&gt;Basic knowledge of JavaScript/TypeScript&lt;/li&gt;
&lt;li&gt;Google Cloud CLI installed and configured&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 1: Initialize Your MCP Server Project
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
bash
mkdir my-mcp-server
cd my-mcp-server
npm init -y
npm install @modelcontextprotocol/sdk
npm install -D typescript @types/node
Create a tsconfig.json:

json
{
  "compilerOptions": {
    "target": "ES2022",
    "module": "ESNext",
    "outDir": "./dist",
    "rootDir": "./src",
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true
  }
}
Step 2: Build a Simple Weather MCP Server
Create src/server.ts:

typescript
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import {
  CallToolRequest,
  ListToolsRequest,
  ToolSchema,
} from "@modelcontextprotocol/sdk/types.js";

const server = new Server(
  {
    name: "weather-mcp-server",
    version: "1.0.0",
  },
  {
    capabilities: {
      tools: {},
    },
  }
);

// Define available tools
const tools: ToolSchema[] = [
  {
    name: "get_weather",
    description: "Get current weather for a city",
    inputSchema: {
      type: "object",
      properties: {
        city: {
          type: "string",
          description: "City name",
        },
      },
      required: ["city"],
    },
  },
];

// Handle tool listing
server.setRequestHandler(ListToolsRequest, async () =&amp;gt; {
  return { tools };
});

// Handle tool execution
server.setRequestHandler(CallToolRequest, async (request) =&amp;gt; {
  if (request.params.name === "get_weather") {
    const city = (request.params.arguments as any).city;

    // Simulate weather API call
    const weatherData = {
      temperature: Math.floor(Math.random() * 30) + 5,
      condition: "sunny",
      humidity: Math.floor(Math.random() * 50) + 30,
    };

    return {
      content: [
        {
          type: "text",
          text: `Weather in ${city}: ${weatherData.temperature}°C, ${weatherData.condition}, ${weatherData.humidity}% humidity`,
        },
      ],
    };
  }

  throw new Error("Tool not found");
});

// Start server
async function main() {
  const transport = new StdioServerTransport();
  await server.connect(transport);
  console.error("Weather MCP Server running on stdio");
}

main().catch(console.error);
Step 3: Create Deployment Configuration
Create Dockerfile:

dockerfile
FROM node:18-alpine

WORKDIR /app

COPY package*.json ./
RUN npm ci --only=production

COPY dist/ ./dist/

ENTRYPOINT ["node", "dist/server.js"]
Create .dockerignore:

text
node_modules
npm-debug.log
src
tsconfig.json
Step 4: Build and Deploy to Cloud Run
Build your project:

bash
npm run build
Build and push container:

bash
gcloud auth configure-docker
gcloud builds submit --tag gcr.io/your-project-id/weather-mcp-server
Deploy to Cloud Run:

bash
gcloud run deploy weather-mcp-server \
  --image gcr.io/your-project-id/weather-mcp-server \
  --platform managed \
  --region us-central1 \
  --allow-unauthenticated \
  --cpu 1 \
  --memory 512Mi
Step 5: Test Your Deployment
Once deployed, you'll get a URL for your service. Test it with:

bash
curl -X POST https://your-service-url.a.run.com \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/list",
    "params": {}
  }'
Integration with MCP Clients
Claude Desktop Configuration
Add to your Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json):

json
{
  "mcpServers": {
    "weather-server": {
      "command": "curl",
      "args": [
        "-X", "POST",
        "-H", "Content-Type: application/json",
        "-d", "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/list\",\"params\":{}}",
        "https://your-service-url.a.run.com"
      ]
    }
  }
}
Best Practices for Production
Authentication: Add API keys or OAuth to secure your endpoint

Monitoring: Implement Cloud Monitoring and logging

Caching: Use Memorystore for frequently accessed data

Scaling: Configure min/max instances based on your needs

Error Handling: Implement comprehensive error handling and retries

Cost Optimization
Cloud Run automatically scales to zero when not in use, making it extremely cost-effective for MCP servers. You'll only pay for:

Compute time during requests

Memory allocated

Network egress

Example Repository
Check out our complete example on GitHub:
github.com/example/mcp-weather-server

Conclusion
Deploying MCP servers to Google Cloud Run provides a scalable, cost-effective solution for extending AI capabilities. With automatic scaling, built-in security, and pay-per-use pricing, you can focus on building powerful tools rather than managing infrastructure.

The entire process—from initial setup to production deployment—can realistically be completed in under 10 minutes, making it accessible for developers of all levels to contribute to the growing MCP ecosystem.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>google</category>
      <category>serverless</category>
      <category>tutorial</category>
      <category>mcp</category>
    </item>
    <item>
      <title>GitHub Actions: Automating Testing in Modern DevOps Workflows</title>
      <dc:creator>ANDY MICHAEL CALIZAYA LADERA</dc:creator>
      <pubDate>Sat, 05 Jul 2025 15:39:09 +0000</pubDate>
      <link>https://dev.to/andy_michaelcalizayalad/github-actions-automating-testing-in-modern-devops-workflows-dlp</link>
      <guid>https://dev.to/andy_michaelcalizayalad/github-actions-automating-testing-in-modern-devops-workflows-dlp</guid>
      <description>&lt;p&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;br&gt;
In the modern software development lifecycle, continuous testing is a critical pillar. Among the many tools enabling Continuous Integration and Continuous Deployment (CI/CD), GitHub Actions has emerged as a powerful, developer-friendly solution, especially for projects hosted on GitHub. This article dives into how GitHub Actions can be used for test automation, how it compares to other tools, and provides a real-world example with a public repository.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Is GitHub Actions?&lt;/strong&gt;&lt;br&gt;
GitHub Actions is a CI/CD platform that allows you to automate your build, test, and deployment pipelines directly in your GitHub repository. You can create workflows triggered by events such as push, pull_request, or schedule.&lt;/p&gt;

&lt;p&gt;✳️ Key Features&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Native integration with GitHub&lt;/li&gt;
&lt;li&gt;Event-driven: Trigger workflows on git events.&lt;/li&gt;
&lt;li&gt;Matrix builds: Run jobs in parallel with different environments.&lt;/li&gt;
&lt;li&gt;Secrets &amp;amp; caching support&lt;/li&gt;
&lt;li&gt;Free for public repositories&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why Use GitHub Actions for Test Automation?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuwnamrfkzibszcbw274e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuwnamrfkzibszcbw274e.png" alt="Image description" width="800" height="272"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Real-World Example: Automating Tests for a Node.js App&lt;br&gt;
📂 Public Repository:&lt;br&gt;
🔗 &lt;a href="https://github.com/andyladera/github-actions-test-demo" rel="noopener noreferrer"&gt;https://github.com/andyladera/github-actions-test-demo&lt;/a&gt;&lt;br&gt;
📝 Workflow YAML: .github/workflows/node-test.yml&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name: Node.js Test CI

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

jobs:
  test:
    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [14, 16, 18]

    steps:
    - name: Checkout code
      uses: actions/checkout@v4

    - name: Use Node.js ${{ matrix.node-version }}
      uses: actions/setup-node@v4
      with:
        node-version: ${{ matrix.node-version }}

    - name: Install dependencies
      run: npm install

    - name: Run tests
      run: npm test

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ What It Does&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Triggers on push or PR to main.&lt;/li&gt;
&lt;li&gt;Runs tests on Node.js versions 14, 16, and 18.&lt;/li&gt;
&lt;li&gt;Runs on a clean Ubuntu VM.&lt;/li&gt;
&lt;li&gt;Outputs logs to GitHub interface.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Advanced Use Case: Parallel Testing with Matrix Builds&lt;br&gt;
GitHub Actions allows matrix testing, which can test multiple OS and language versions at the same time — crucial for cross-platform applications.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;matrix:
  os: [ubuntu-latest, windows-latest]
  node-version: [14, 16]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br&gt;
GitHub Actions provides an efficient and integrated way to handle automated testing within the GitHub ecosystem. With native support, a growing marketplace, and community-driven development, it's a top choice for modern DevOps pipelines — especially for open-source and startup teams looking for a zero-cost solution.&lt;/p&gt;

&lt;p&gt;If you're using GitHub — GitHub Actions should be your first CI tool to try.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
