The short answer

Yes, you can connect Barefoot to Claude. Barefoot Technologies exposes an open API as a SOAP web service, BarefootService.asmx, hosted at portals.barefoot.com, with operations for properties, availability, rates, reservations, guests, and owners. There is no official Barefoot MCP server as of July 2026, so the working path is a small Model Context Protocol server you run locally: it signs each SOAP request with the username, password, and barefootAccount credentials Barefoot issues you, parses the XML responses to JSON, and hands the results to Claude Desktop. Setup takes about 25 minutes once you have credentials.

Barefoot actually has an API worth wrapping

Barefoot is one of the longest-standing PMS platforms serving professional vacation rental managers. In our analysis of the VRMA member directory, Barefoot ranked sixth among all property management systems, powering 4.2 percent of members whose PMS we could identify, almost entirely established professional operators (see our PMS generational shift analysis). Integration has been part of that longevity: according to Barefoot, the company "has been a leader in API integration for more than 15 years," and its partnerships page describes an open API, direct integrations with Vrbo, Airbnb, and TripAdvisor, and what Barefoot calls "the most extensive partner program in the industry."

For connecting outside software, Barefoot documents two doors:

Door one

Barefoot iLink

Barefoot's quick website connector, which the company describes as "perfect for smaller companies who are just getting started." It links a website to the booking engine with minimal setup, but it is not a general-purpose data API.

Door two, the one we use

The Barefoot API

According to Barefoot's website integration page, the API "gives your internet marketing staff or partners all the control of how to organize how data is presented from the Barefoot system," and is "a well documented API that is open to other creative uses as well." Connecting Claude is exactly that kind of creative use: the MCP server below is just another API consumer.

What you'll be able to ask Claude

Once connected, Claude can answer the questions an established manager normally digs through Barefoot screens or exported reports for:

"List every property in our Barefoot account with its ID, name, and bedroom count as a table."
"Which units are still open for the week of August 8 to 15? Group by property type."
"Compare open availability for Labor Day weekend against the two weeks after it."
"Look up the guest record for the Hendersons and summarize their stay history with us."
"Call GetPropertyRates for unit 118 and explain the rate table in plain English."

What the web service exposes

The BarefootService endpoint publishes its full operation list publicly, each with sample SOAP 1.1 and SOAP 1.2 requests and responses. A sampling of the operations listed on the live service page:

BarefootService.asmx portals.barefoot.com/barefootwebservice/
Properties
GetAllPropertyGetPropertyDetailsGetPropertyRatesGetPropertyAllImgs
Availability
GetPropertyAvailabilityByDateGetPropertyAvailabilityByTermIsPropertyAvailability
Reservations
GetGuestReservationsGetFolioInfoByNumberPropertyBookingCancelReservationDW
Guests & owners
GetTenantInfoByPageGetTenantListGetOwnersGetOwnerInfo
Quotes
CreateQuoteGetQuoteDetailGetQuoteRatesDetail
Every operation authenticates with the same three parameters: username, password, and barefootAccount. The server we build only calls read operations.

Prerequisites

  • A Barefoot account with web service credentials. Barefoot issues these directly; there is no self-serve developer portal. See step 1.
  • Claude Desktop installed, or the Claude Code CLI. Download Claude Desktop.
  • Node.js 18 or later. Check with node --version.

Walkthrough: build the MCP server

1

Get API credentials from Barefoot

This is the only step you cannot do alone. The web service authenticates every call with three values: a username, a password, and a barefootAccount string, and those come from Barefoot, not from a signup form.

  • If you already have a website or channel integration running on the API, your web developer or integration partner likely has these credentials already. Ask them first.
  • Otherwise, ask your Barefoot account contact for web service credentials. For API and integration questions Barefoot publishes 877-799-1110 Ext. 3 and sales@barefoot.com as the contact points.

Tell them what you want: read access to the BarefootService web service for internal reporting. Working with Barefoot directly here is the right move anyway; they know which operations are enabled for your account.

2

Set up the Node.js project

Three dependencies: the MCP SDK, zod for input validation, and fast-xml-parser because Barefoot answers in XML and Claude works better with JSON.

Terminal
mkdir barefoot-mcp
cd barefoot-mcp
npm init -y
npm install @modelcontextprotocol/sdk zod fast-xml-parser

Add "type": "module" to package.json:

package.json
{
  "name": "barefoot-mcp",
  "version": "1.0.0",
  "type": "module",
  "main": "index.js",
  "dependencies": {
    "@modelcontextprotocol/sdk": "^1.0.0",
    "fast-xml-parser": "^4.4.0",
    "zod": "^3.22.0"
  }
}
3

Create the MCP server file

Save the following as index.js. It builds a SOAP 1.1 envelope for each call, posts it to BarefootService.asmx with the right SOAPAction header, and parses the XML response. Three tools: get-all-properties, get-availability-by-date, and a generic call-barefoot-operation for any other read operation listed on the service page.

index.js
#!/usr/bin/env node
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { XMLParser } from "fast-xml-parser";
import { z } from "zod";

const USERNAME = process.env.BAREFOOT_USERNAME;
const PASSWORD = process.env.BAREFOOT_PASSWORD;
const ACCOUNT = process.env.BAREFOOT_ACCOUNT;
const ENDPOINT =
  "https://portals.barefoot.com/barefootwebservice/BarefootService.asmx";
const NS = "http://www.barefoot.com/Services/";

if (!USERNAME || !PASSWORD || !ACCOUNT) {
  console.error(
    "Missing BAREFOOT_USERNAME, BAREFOOT_PASSWORD, or BAREFOOT_ACCOUNT"
  );
  process.exit(1);
}

const parser = new XMLParser({ ignoreAttributes: false });

function escapeXml(value) {
  return String(value)
    .replaceAll("&", "&")
    .replaceAll("<", "<")
    .replaceAll(">", ">")
    .replaceAll('"', """)
    .replaceAll("'", "'");
}

async function callBarefoot(operation, params = {}) {
  const fields = {
    username: USERNAME,
    password: PASSWORD,
    barefootAccount: ACCOUNT,
    ...params,
  };
  const body = Object.entries(fields)
    .map(([key, value]) => `<${key}>${escapeXml(value)}</${key}>`)
    .join("");
  const envelope =
    `<?xml version="1.0" encoding="utf-8"?>` +
    `<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">` +
    `<soap:Body><${operation} xmlns="${NS}">${body}</${operation}>` +
    `</soap:Body></soap:Envelope>`;

  const response = await fetch(ENDPOINT, {
    method: "POST",
    headers: {
      "Content-Type": "text/xml; charset=utf-8",
      SOAPAction: `"${NS}${operation}"`,
    },
    body: envelope,
  });

  const text = await response.text();
  if (!response.ok) {
    throw new Error(`Barefoot API ${response.status}: ${text.slice(0, 500)}`);
  }

  // Parse the envelope; many operations return XML nested inside
  // a <OperationName>Result string, so parse that too if present.
  const parsed = parser.parse(text);
  const resultKey = `${operation}Result`;
  const resultNode = JSON.stringify(parsed).includes(resultKey)
    ? parsed["soap:Envelope"]?.["soap:Body"]?.[`${operation}Response`]?.[
        resultKey
      ]
    : null;
  if (typeof resultNode === "string" && resultNode.trim().startsWith("<")) {
    return parser.parse(resultNode);
  }
  return resultNode ?? parsed;
}

const server = new McpServer({
  name: "barefoot",
  version: "1.0.0",
});

// Tool 1: List all properties
server.tool(
  "get-all-properties",
  "List all properties in the Barefoot account via the GetAllProperty operation. Returns the full property list with IDs. Use this first to discover property IDs for other queries.",
  {},
  async () => {
    const data = await callBarefoot("GetAllProperty");
    return {
      content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
    };
  }
);

// Tool 2: Availability across a date range
server.tool(
  "get-availability-by-date",
  "Check which properties are available between two dates via the GetPropertyAvailabilityByDate operation.",
  {
    date1: z.string().describe("Start date, e.g. 2026-08-08"),
    date2: z.string().describe("End date, e.g. 2026-08-15"),
    weekly: z
      .string()
      .optional()
      .describe("Weekly-rental flag if your account uses it, e.g. 'false'"),
  },
  async ({ date1, date2, weekly }) => {
    const data = await callBarefoot("GetPropertyAvailabilityByDate", {
      date1,
      date2,
      weekly: weekly ?? "false",
    });
    return {
      content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
    };
  }
);

// Tool 3: Generic read operation
server.tool(
  "call-barefoot-operation",
  "Call any read-only Barefoot web service operation by name, e.g. GetPropertyDetails, GetPropertyRates, GetTenantList, GetOwners, GetGuestReservations. Credentials are added automatically. Check the operation's page at BarefootService.asmx for its exact parameter names. Never call write operations (PropertyBooking, UpdatePropertyPrice, CancelReservationDW, Add*/Set*/Remove*).",
  {
    operation: z
      .string()
      .describe("Operation name exactly as listed, e.g. GetPropertyRates"),
    params: z
      .record(z.string())
      .optional()
      .describe("Operation parameters as key-value strings"),
  },
  async ({ operation, params }) => {
    if (!/^(Get|Is)/.test(operation)) {
      throw new Error(
        `Blocked: '${operation}' is not a read operation. This server only allows Get*/Is* calls.`
      );
    }
    const data = await callBarefoot(operation, params ?? {});
    return {
      content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
    };
  }
);

const transport = new StdioServerTransport();
await server.connect(transport);

Note the guard in the third tool: anything that doesn't start with Get or Is is refused, so Claude cannot reach the booking, pricing, or cancellation operations even by name.

4

Register the server with Claude Desktop

Open your Claude Desktop config file:

macOS path
~/Library/Application Support/Claude/claude_desktop_config.json
Windows path
%APPDATA%\Claude\claude_desktop_config.json

Add the Barefoot entry (merge it into your existing mcpServers block if you've set up other guides from this series):

claude_desktop_config.json
{
  "mcpServers": {
    "barefoot": {
      "command": "node",
      "args": ["/absolute/path/to/barefoot-mcp/index.js"],
      "env": {
        "BAREFOOT_USERNAME": "your_web_service_username",
        "BAREFOOT_PASSWORD": "your_web_service_password",
        "BAREFOOT_ACCOUNT": "your_barefootAccount_string"
      }
    }
  }
}

Replace the path and the three credential values with what Barefoot issued you. Then fully quit and reopen Claude Desktop.

Try it

"List all our Barefoot properties as a table with ID, name, and bedrooms. Then check which of them are open between August 8 and August 15."

Troubleshooting

The response says invalid login, or comes back empty

Barefoot's web service authenticates inside the SOAP body, so a bad credential often returns HTTP 200 with an error message or empty result rather than a 401. Double-check all three values, especially barefootAccount, which is a separate string from your username. If you copied credentials from a web developer's config, confirm they are for the web service, not an iLink or portal login.

HTTP 500 with a SOAP Fault

Usually a malformed request: a misspelled operation name, a missing required parameter, or a parameter name with wrong casing. Open BarefootService.asmx?op=OperationName in a browser; each operation's page shows the exact SOAP request with every parameter name. Match them exactly, ASMX services are case-sensitive on element names.

An operation returns nothing even with valid credentials

Not every operation is necessarily enabled for every account. Which data the web service returns depends on how Barefoot has configured your account. If a specific operation you need comes back empty, ask your Barefoot contact whether it is switched on for you; that is faster than debugging XML.

Claude says it doesn't see any Barefoot tools

Claude Desktop only reads the config file at startup. Fully quit Claude (Cmd+Q on macOS, right-click tray icon then Quit on Windows) and reopen it. Closing the window doesn't reload the config.

Still broken? Check Help, then Open Logs Folder for a startup error. Common causes: invalid JSON in the config file, wrong absolute path to index.js, or node not being in your PATH.

The parsed result is a giant blob of nested JSON

That's Barefoot's XML faithfully converted. Some operations return their payload as an XML string inside the ...Result element; the server already unwraps and re-parses that case. If a specific operation still comes back ugly, just tell Claude what you want from it ("pull out property ID, name, and bedrooms into a table"), turning messy structures into readable answers is the part Claude is good at.


FAQ

Does Barefoot have a public API?

Yes. Barefoot maintains an open API alongside its iLink website connector, and the BarefootService web service publishes its operation list publicly at portals.barefoot.com. Barefoot's website integration page calls it "a well documented API that is open to other creative uses as well," with iLink positioned for smaller companies and the API for teams with technical staff or partners.

Is the Barefoot API REST or SOAP?

SOAP. BarefootService.asmx is a .NET ASMX web service; the operation pages show sample SOAP 1.1 and SOAP 1.2 requests and responses. Every operation authenticates with username, password, and barefootAccount parameters in the request body, and answers in XML, which is why the server in this guide includes an XML parser.

Is there an official Barefoot MCP server?

Not that we could find. As of July 2026 there is no Barefoot server in the Model Context Protocol registry or the community server lists, and Barefoot has not announced one. The 60-line server above is the working path today, and if Barefoot ships an official connector later, everything you learn asking Claude questions now carries straight over.

How do I get Barefoot API credentials?

From Barefoot directly. There is no self-serve developer signup; ask your account contact, or use the contacts Barefoot publishes for API questions: 877-799-1110 Ext. 3 or sales@barefoot.com. If a web agency built your Barefoot-connected website, they may already hold web service credentials you can reuse.

Can Claude change data in my Barefoot account with this setup?

No. The server only exposes read operations, and its generic tool refuses any operation name that doesn't start with Get or Is. Barefoot's web service does list write operations like PropertyBooking and UpdatePropertyPrice, but this guide deliberately keeps them out of Claude's reach. If you ever want writes, run them as a separate server so exploration stays safe.

Sources & references

  1. APIs and Partnerships, Barefoot online vacation rental softwarehttps://www.barefoot.com/barefoot-apis-and-partnerships
  2. Website Integration, Barefoot Vacation Rental Booking Software (iLink vs API)https://www.barefoot.com/website-integration
  3. BarefootService Web Service, live operation listinghttps://portals.barefoot.com/barefootwebservice/BarefootService.asmx
  4. What's the Deal with API's in the Vacation Rental Management Industry?, Barefoot bloghttps://www.barefoot.com/blog/whats-the-deal-with-apis-in-the-vacation-rental-management-industry
  5. Model Context Protocol TypeScript SDKhttps://github.com/modelcontextprotocol/typescript-sdk
  6. The PMS Generational Shift, RapidEye analysis of the VRMA member directoryhttps://rapideyeinspections.com/blog/vacation-rental-pms-generational-shift/

Other guides

This is one of a series on connecting the professional VR stack to Claude. Browse all the guides, or jump to a neighbor.