Search Public Tenders with Claude

Build an Apify tool that lets Claude search a live public tenders feed.

Introduction

30 Second Summary

Finding relevant government contracts usually means scanning long lists before a deadline slips by. Useful opportunities can disappear inside notices unrelated to your work.

In this project, you will turn a public tenders feed into a searchable Apify Actor with keyword filtering plus clean records. Then Claude Desktop can call it through MCP whenever you ask a plain-English question.

What You'll Build

Your question about software tenders this week produces live records you can verify against your Actor's dataset.

By the end of this project, you'll have:

  • Live keyword searches that keep only the tenders related to your question.
  • Clean tender records with readable titles. Each record includes its date plus a link to the source notice.
  • Verifiable Claude answers grounded in the Actor's latest dataset. You can compare each answer with the records from the run.
  • Secret Mission: Add a configurable closing-date filter so Claude can narrow results to tenders due within a chosen date range.

Do I need coding experience?

You'll need Claude Desktop installed. Basic JavaScript or Python familiarity helps, while the walkthrough covers the Apify setup.

Before We Start

Your tender assistant needs a cloud workspace for its data tool. It also needs a desktop app that can call that tool.

An account in Apify Console gives your Actor a place to run. Claude Desktop becomes the local side of the connection you configure later.

In this step, get ready to:
  • Create an Apify account and sign in to Apify Console.
  • Confirm that your Actors list is empty.
  • Install Claude Desktop on your computer.
Create your Apify account

Apify Console is where you manage the programs that collect and process your tender data. Your new account begins with no Actors.

What is an Actor?

An Actor is a cloud program that performs a defined task. It can receive structured input before each run.

Your Actor will read the public tenders feed and return records that match your keyword.

Email and password

  • Enter your email address.
  • Create a secure password.
  • Select Sign up.
  • Open the verification email from Apify.
  • Select the verification link in the message.
  • Sign in to Apify Console if prompted.

Google or GitHub

  • Select Continue with Google or Continue with GitHub.
  • Sign in on your provider's authentication page.
  • Authorize Apify to access your account.

You'll return to Apify Console after authorization.

  • Select Actors in the left panel.

That clean list is your first win. You'll see no Actor entries because this account has not created one yet.

Can't reach the Actors page?

  • Return to the Apify Console sign-in page.
  • Select Resend verification email if your email address still needs verification.
  • Check for a blocked authentication pop-up if you chose Google or GitHub.

Get help with my Apify account setup. You can also ask the Apify developer community.

Install Claude Desktop

Claude Desktop hosts the MCP connection that lets Claude call your Actor. Installing the app now keeps the later configuration focused on that connection.

Anthropic provides separate installers for macOS and Windows.

macOS

  • Visit the official Claude download page.
  • Select Download for macOS.
  • Open the downloaded installer.
  • Complete the installation prompts.
  • Press Cmd+Space to open Spotlight Search.
  • Type Claude and press Enter.

Windows

  • Visit the official Claude download page.
  • Select Download for Windows.
  • Open the downloaded installer.
  • Complete the installation prompts.
  • Press the Windows key to open the search bar.
  • Type Claude and press Enter.

You'll see Claude Desktop open to a sign-in screen or the main app window. The local app is now available for configuration.

Claude Desktop won't open?

  • Confirm that you downloaded the installer for your operating system.
  • Remove any incomplete installer download.
  • Download the installer again from the official page.

Help me troubleshoot my Claude Desktop installation. You can also follow the official installation guide.

Verify both starting points

The next step depends on both services being ready. This final check gives you a clean baseline before you create anything.

Before you check, which two visible signs would prove that your setup is complete?

  • Switch back to Apify Console from earlier.
  • Select Actors in the left panel.
  • Confirm that the page contains no Actor entries.
  • Return to Claude Desktop from earlier.
  • Confirm that the app opens without starting the installer.

You are signed in to Apify Console. The Actors list is empty.

Claude Desktop is installed locally. It is ready to be configured.

Your two starting points are ready. Next, you will create an Actor from a template.

Create Your Tenders Actor

Your account is ready in the Apify Console. The empty list means Claude Desktop still has no tender tool to call.

An Actor gives the project a runnable home for the feed. A feed-scraping template supplies the first working data path.

In this step, get ready to:
  • Create an Actor named Public Tenders Search from a feed-scraping template.
  • Point the Actor at a public government tenders feed.
  • Run the Actor once to place raw tender entries in its default dataset.
Create the Actor from a template

A feed-scraping template already contains the machinery for reading public feeds. Starting from that foundation keeps this step focused on your tender source.

  • On the Actors page from earlier, select Develop new.
  • Select Browse all templates.
  • Search the template gallery for RSS.
  • Choose the feed-scraping template that accepts public RSS or Atom URLs.
  • Select Use this template.

You should land on a new Actor page with the template files ready in the browser.

  • Open the three-dot menu in the top-right corner of the Actor page.
  • Choose Edit name or description.
  • Enter Public Tenders Search as the Actor name.
  • Select Save.

Good start. Your Actors list now has a named tool ready to receive the government feed.

Cannot find a feed template?

  • Clear any language filter that limits the template results.
  • Confirm that the chosen template accepts RSS or Atom URLs as input.

Ask for targeted help with finding a suitable Apify feed template. You can also ask the Apify and Crawlee community.

Connect the public tenders feed

The Plataforma de Contratación del Sector Público publishes reusable tender data through public feeds. Each XML entry represents tender information from the government source.

The first run keeps those entries unfiltered. This gives you a raw baseline before you add keyword filtering in the next step.

  • Open the official PLACSP open-data page in a new browser tab.
  • Open the current data resource for tenders published in contracting profiles.
  • Copy its Atom or XML feed URL here: your public tenders feed URL.
  • Return to Public Tenders Search in Apify Console.
  • Select the Input tab.
  • Replace the template's sample URL with your public tenders feed URL.
  • Leave any keyword fields empty.
  • Leave any date filter empty.

The Actor input now points directly to the government feed. Its empty filters preserve the raw entries for this first run.

Run the Actor and inspect the dataset

The Actor turns the feed response into rows that remain available after the run finishes. Opening those rows proves that Apify can reach the source.

Before you start the run, do you expect the feed to produce one record or several?

  • Select Start to run Public Tenders Search.
  • Wait for the run to finish.

You should see the run complete with output available.

  • Select the Output tab.
  • Open the default Dataset.

You should see rows of raw tender-feed data. The rows should contain tender titles plus publication dates or source links.

  • Inspect two rows to confirm that they represent different tender records.
  • Leave the default dataset open for the next step.

That is your first live data win. Your Actor now pulls government tender entries into Apify storage.

Dataset empty?

  • Return to the Input tab.
  • Confirm that the URL points directly to an Atom or XML resource.
  • Replace any remaining sample URL with your public tenders feed URL.

Ask for targeted help with debugging an empty Apify dataset. You can also ask the Apify and Crawlee community.

Your tender feed now reaches a working Actor. Next, you will filter those raw rows by keyword and shape them into records that Claude can use.

Filter and Clean Tender Results

Your first run proved that the Public Tenders Search Apify Actor can read the government feed. The raw entries in its dataset give you a reliable starting point.

Raw feed data is too noisy for a useful tender search. This step adds a keyword filter. It also gives each match a small set of useful fields.

In this step, get ready to:
  • Create a keyword input for tender searches.
  • Filter raw entries without letter case affecting the matches.
  • Run the Actor again to produce tidy tender records.
Add the keyword input

An input schema describes the values an Actor accepts. Apify uses it to create the run form. Apify also validates the submitted input against it.

  • Return to the Public Tenders Search Actor from your first run.
  • Select the Source tab.
  • Select Code.
  • Select the existing input schema definition in the file tree.
  • Add one required string property for the search keyword.
  • Set its visible title to Keyword.
  • Describe the field as a case-insensitive search across each tender's title plus its description or summary.
  • Select Build.

Apify takes you to the Last build view while it packages the updated Actor. The logs show its progress.

  • Confirm that the build finishes successfully.
  • Return to the Source tab.
  • Select Input.
  • Confirm that the run form now contains the Keyword field.

Good progress. Your Actor now asks for the search term that controls each run.

Keyword field missing?

Check that the new property sits inside the schema's properties object. Confirm that its type is a string.

Run another build after correcting the schema. Help me diagnose why my Actor input field is missing.

Filter and map the feed entries

A case-insensitive filter compares normalized text. This allows a search to match the same word despite capitalization differences.

How should the filter work?

The Actor reads the keyword from its input. It compares that keyword with searchable text from each raw entry.

  • The searchable text combines the tender title with its description or summary.
  • The keyword uses one consistent letter case during comparison.
  • The searchable text uses the same letter case during comparison.
  • Only entries containing the keyword reach the output dataset.
  • Every clean record includes a title.
  • Every clean record includes a publication date.
  • Every clean record includes a link.
  • Every clean record includes a description or summary.
  • A clean record includes a closing date when the feed provides one.
  • Return to the Source tab.
  • Select Code.
  • Update the template's existing feed-entry processing to follow the filter contract above.
  • Select Build.
  • Confirm that the Last build view reports a successful build.

The successful build proves that Apify can package the new filtering logic. The next run proves that the logic produces the right records.

Build not completing?

Check the build logs for the first reference to your changed feed-processing section. A missing delimiter or an unmatched bracket can stop the source from compiling.

Confirm that the input property used by the processing logic matches the property defined in the input schema. Help me troubleshoot my tender filter build.

Run and inspect the filtered Actor

A keyword taken from the first run gives you a predictable test. Changing its capitalization checks whether the comparison really ignores letter case.

  • Return to the Output view from the first Actor run.
  • Choose one distinctive word that appears in a raw tender title or its description.
  • Record that word using different capitalization here: a keyword with changed capitalization.
  • Return to the Source tab.
  • Select Input.
  • Enter a keyword with changed capitalization in the Keyword field.

Before you start the second run, do you expect the changed capitalization to affect which tender matches?

  • Select Start.
  • Wait for the second run to complete.
  • Select the run's Output tab.

You'll see records where your keyword appears in the title or the description or summary. The changed capitalization still produces a match.

What should I see?

The second run's dataset contains only keyword-matching tenders. Each row presents the feed data as a compact tender record.

You can see the title plus the publication date. You can also see the link plus a description or summary.

A closing date is present when the source entry supplies one. An unavailable closing date does not remove an otherwise valid match.

  • Confirm that every row contains your keyword in its title or description or summary.
  • Confirm that every row includes a title.
  • Confirm that every row includes a publication date.
  • Confirm that every row includes a link.
  • Confirm that every row includes a description or summary.
  • Confirm that a closing date appears when its source entry provides one.

Seeing no matches or raw fields?

For an empty dataset, compare the keyword with the raw entry you selected. Remove any spaces copied before or after the word.

For raw output fields, confirm that the Actor writes the clean record after the keyword check. Help me fix my filtered tender dataset.

That is the transformation complete. Your Actor now turns a broad government feed into searchable tender records.

Your filtered Actor is ready to become an AI tool. Next up, you connect it to Claude Desktop through the Apify MCP server.

Connect Claude Desktop to Apify

Your Apify Actor now turns the public feed into a clean dataset of matching tenders. Claude Desktop still needs a route to that live data.

The Model Context Protocol (MCP) provides that bridge. In this step, you connect Claude Desktop to the Apify MCP server with your API token.

In this step, get ready to:
  • Collect the connection details for your Actor.
  • Configure Claude Desktop to launch the Apify MCP server.
  • Verify that Public Tenders Search appears in Claude's tool list.
Collect the connection details

Claude needs an API token to access your Apify account. The Actor full name tells the MCP server which Actor to expose.

Keep your token private

Credential steps can feel sensitive. The checkpoint later captures only the tool list.

  • Keep your API token out of shared files.
  • Keep your API token out of screenshots.
  • Return to the Apify Console from earlier.
  • Select Settings in the Console sidebar.
  • Select API & Integrations.
  • Use the copy control beside your API token.
  • Return to the Public Tenders Search Actor.
  • Select the Actor title at the top of the page.
  • Copy the unique name shown in the username/actor-name format.
  • Record the unique name here: your-username/public-tenders-search.
Add the Apify MCP configuration

Claude Desktop reads local MCP servers from a configuration file. This file tells Claude which process to launch.

  • Press Cmd+Space on macOS or the Windows key on Windows.
  • Type Claude into the search bar.
  • Press Enter to open Claude Desktop.
  • Open Claude Desktop's application menu.
  • Select Settings.
  • Select Developer in the sidebar.
  • Select Edit Config.

Your computer opens claude_desktop_config.json in its default text editor.

  • Replace the contents of claude_desktop_config.json with the configuration below while substituting your copied token for your-apify-api-token-here:
{
  "mcpServers": {
    "actors-mcp-server": {
      "command": "npx",
      "args": [
        "-y",
        "@apify/actors-mcp-server",
        "--tools",
        "[[ACTOR_FULL_NAME="your-username/public-tenders-search"]]"
      ],
      "env": {
        "APIFY_TOKEN": "your-apify-api-token-here"
      }
    }
  }
}

What does this configuration do?

  • The mcpServers object registers a server that Claude Desktop can launch.
  • The npx command downloads the Apify MCP server package on its first launch.
  • The --tools option exposes the Actor identified by your captured full name.
  • The APIFY_TOKEN value authorizes the server to access your Apify account.
  • Save claude_desktop_config.json.

The editor's unsaved-change marker should clear. Your MCP configuration is now ready for Claude Desktop to reload.

Seeing a JSON warning?

  • Confirm that every opening brace has a matching closing brace.
  • Confirm that the value under APIFY_TOKEN remains inside double quotes.
  • Confirm that no comma appears after the final closing brace.

Ask for help with the file structure without sharing your token: Help me check this Claude Desktop MCP configuration for JSON syntax problems without asking me to reveal my API token.

✔️ Awesome, I've got everything!

Your saved configuration now points Claude Desktop at the Apify MCP server.

ⓧ I'd like to double check the full code

This reference keeps the API token hidden with a safe placeholder.

{
  "mcpServers": {
    "actors-mcp-server": {
      "command": "npx",
      "args": [
        "-y",
        "@apify/actors-mcp-server",
        "--tools",
        "[[ACTOR_FULL_NAME="your-username/public-tenders-search"]]"
      ],
      "env": {
        "APIFY_TOKEN": "your-apify-api-token-here"
      }
    }
  }
}
Restart Claude Desktop and verify the tools

Claude Desktop loads MCP configuration when the application starts. Closing only its window leaves the old configuration running.

Before you restart, which Actor do you expect Claude to reveal in its tool list?

macOS

  • Press Cmd+Q to quit Claude Desktop completely.

Windows

  • Right-click the Claude icon in the Windows system tray.
  • Select Exit.
  • Press Cmd+Space on macOS or the Windows key on Windows.
  • Type Claude into the search bar.
  • Press Enter to reopen Claude Desktop.
  • Create a new conversation.
  • Select the Add files, connectors, and more icon in the conversation input box.
  • Point to Connectors.
  • Select Manage connectors.
  • Select actors-mcp-server to review its available tools.

You should see actors-mcp-server as connected. Its available tools should include Public Tenders Search.

That bridge is live: Claude Desktop can now see Public Tenders Search as a callable tool.

Actor missing from the tool list?

  • Quit Claude Desktop completely before reopening it.
  • Check that your saved configuration no longer contains your-apify-api-token-here.
  • Check that the Actor full name matches the unique name shown in Apify Console.
  • Set the Apify tools to Always allow or Ask first if their permissions are blocked.

Need help isolating the connection problem? Help me troubleshoot why Public Tenders Search is missing from my Claude Desktop tool list without asking me to share my API token.

Claude can now reach your tender Actor through MCP. Next, you will ask a plain-English tender question and compare Claude's answer with the dataset.

Ask Claude About Open Tenders

Your Apify Actor, Public Tenders Search, is already visible in Claude Desktop.

The final test is whether Claude turns your plain-English question into an MCP tool call. The dataset lets you trace each tender back to the feed.

In this step, get ready to:
  • Ask Claude which tenders mention software this week.
  • Confirm that Claude calls Public Tenders Search.
  • Verify Claude's tender entries against the Apify dataset.
Ask Claude to search the feed

Your question supplies the keyword software. It also tells Claude to focus on this week's records.

  • Return to Claude Desktop from earlier.
  • Start a fresh conversation.

Before you send the question, do you think Claude can find current results without you naming the Actor?

  • Place the question in Claude's message box by pasting the text below:
which tenders mention software this week

How does Claude use this question?

Claude can map software to the Actor's keyword input. The phrase this week tells Claude to use the returned publication dates when it builds the answer.

MCP carries the tool request to Apify. Claude then summarizes the records returned by Public Tenders Search.

  • Submit the question.
  • Inspect the tool-use details attached to Claude's response.

You'll see Public Tenders Search in the tool-use details. Claude's answer contains software-related tender titles from this week.

The answer also includes links you can verify against the dataset. That is the full connection working: a plain-English question has triggered your Actor.

Claude skipped the Actor?

Claude may answer from the conversation when the Actor is unavailable. Confirm the connection before trying the question again.

  • Return to the tool list from earlier.
  • Confirm that Public Tenders Search still appears.
  • Restart Claude Desktop if the Actor has disappeared.
  • Send the same question in a fresh conversation.

Help me find out why Claude is not calling my Public Tenders Search Actor.

Verify the answer against the dataset

Claude's answer becomes trustworthy when its details match the Actor's output. The default dataset gives you a record-by-record evidence trail.

  • Return to the Apify Console from earlier.
  • Select the Public Tenders Search Actor from your Actors list.
  • Open the default dataset for the Actor's latest run.

Before you compare the records, do you expect Claude's title, dates, and link to match the dataset exactly?

  • Choose one tender from Claude's answer.
  • Locate the same tender title in the default dataset.
  • Compare the publication date with Claude's answer.
  • Compare the closing date when the record includes one.
  • Compare the link with Claude's answer.

You'll see the same tender title in both places. Its publication date matches.

The closing date matches when available. The link matches too.

You have closed the loop: Claude's answer now traces back to the Actor's live dataset.

Can't find the same tender?

  • Refresh the default dataset view.
  • Confirm that the latest Actor records use the keyword software.
  • Return to Claude Desktop from earlier if the dataset contains records for a different keyword.
  • Send the tender question again.

Help me compare Claude's tender answer with my Apify dataset.

Secret mission

Audit Claude's Tender Evidence

Turn Claude's tender answer into an evidence table with dates and source links. Then spot-check two rows against the Apify dataset to prove that the answer is grounded in real tender records.

Clean Up Your Resources

Clean Up Your Resources

Choose whether to keep the project ready, pause local access, or remove its resources entirely. No scheduled runs are consuming your Apify account allowance in the background.

Resources you used:

  • Public Tenders Search Actor containing the public tenders feed integration and keyword filter.
  • Default dataset containing clean matching tender records.
  • Claude Desktop configuration containing the Apify MCP server entry and your API token.

Keep everything running

Choose this option if you plan to search for more public tenders through Claude. Your Actor remains ready for future questions.

  • Keep the Public Tenders Search Actor available in Apify.
  • Retain the default dataset as a record of the tenders returned during this project.
  • Leave the Apify MCP server entry in your Claude Desktop configuration.
  • Protect the configuration because it contains your Apify API token.
  • Run the Actor only when you need fresh tender results.

Pause - I'll come back to this later

Closing Claude Desktop pauses local access to the Apify tools. Your Actor and dataset remain stored for your return.

  • Quit Claude Desktop through your operating system's app menu.
  • Leave the Public Tenders Search Actor unchanged in Apify.
  • Leave the default dataset unchanged in Apify.
  • Keep the Claude Desktop MCP configuration private while the project is paused.

Delete - I don't want to use this again

Permanent deletion is a bigger step, so check that you no longer need the returned tender links before you continue. Your Apify account and Claude Desktop installation remain available after these project resources are removed.

  • Return to the Public Tenders Search Actor in the signed-in Apify Console.
  • Open its default dataset containing the software-related tender results.
  • Use the dataset's permanent deletion control to remove the default dataset.
  • Return to the Public Tenders Search Actor page.
  • Open the Actor's settings area.
  • Use the permanent deletion control to remove the Actor.
  • Return to the Claude Desktop MCP configuration from earlier.
  • Remove the entire Apify MCP server entry.
  • Confirm that the Apify API token is absent from the local configuration.
  • Save the Claude Desktop configuration.
  • Restart Claude Desktop.
  • Check the Claude Desktop tool list for Public Tenders Search.
  • Return to the Actors list in the Apify Console.

You should no longer see Public Tenders Search in the Actors list. The Claude Desktop tool list should no longer show the Actor.

That closes the project cleanly. Your Apify account and Claude Desktop installation remain available.

Nice Work!

Nice Work!

You did it! Your Apify Actor now turns a public government feed into filtered tender records. Claude Desktop can call it through the Apify MCP server to answer tender questions with dataset-verifiable links.

What you learned:

  • Built a case-insensitive tender search that keeps matching feed entries. Shaped each match into a clean record with the details needed to evaluate the opportunity.
  • Connected Public Tenders Search to Claude Desktop through the Apify MCP server. Confirmed that the Actor appears in Claude's tool list.
  • Asked a live tender question in plain English. Verified Claude's linked results against the Actor's default dataset.
  • Secret Mission: Applied your skills in an optional challenge that pushes the tender-search workflow further.

Ready to quiz yourself?