I replicated your jsForce test in a Visualforce page with:
<apex:page docType="html-5.0" showHeader="false">
<script src="//cdnjs.cloudflare.com/ajax/libs/jsforce/1.4.1/jsforce.min.js"></script>
<script>
var apexBody = "<" + "apex:page standardController=\'Account\'>Test" + "<" + "/apex:page>";
var conn = new jsforce.Connection({ accessToken: '{!$API.Session_Id}' });
conn.tooling.sobject('ApexPage').create({
Markup: apexBody,
Name: "PageTest",
Masterlabel: "PageTestLabel",
ControllerType: "1",
ApiVersion: "33.0"
}, function(err, res) {
if (err) { return console.error(err); }
console.log(res);
});
</script>
</apex:page>
Note that I added ControllerType
with the value of 1 based on Creating Visualforce Page Using Tooling API.
This resulted in a POST request to https://mynamespace.na17.visual.force.com/services/data/v33.0/tooling/sobjects/ApexPage
With the headers:
- Content-Type:application/json
- Authorization:Bearer 00Do00000000001!AQ8AQA05qLAXINotMyRealSessionId8v92WE
Payload:
{"Markup":"<apex:page standardController='Account'>Test</apex:page>","Name":"PageTest","Masterlabel":"PageTestLabel","ControllerType":"1","ApiVersion":"33.0"}
I received the same 400 Bad Request response that you did:
[
{
"message": "Object type not accessible. Please check permissions and make sure the object is not in development mode: sObject type 'Account' is not supported.. Original queryString was: 'SELECT Id FROM Account WHERE id = '000000000000000'': Markup",
"errorCode": "FIELD_INTEGRITY_EXCEPTION",
"fields": [
"Markup"
]
}
]
Out of interest, I created the ApexPage directly in the Salesforce UI and then retrieved the resulting JSON definition via the Tooling API.
{
"attributes": {
"type": "ApexPage",
"url": "/services/data/v33.0/tooling/sobjects/ApexPage/066o0000002eacAAAQ"
},
"Id": "066o0000002eacAAAQ",
"NamespacePrefix": "DF14DFB",
"Name": "PageTest",
"ApiVersion": 33,
"MasterLabel": "PageTestLabel",
"Description": null,
"ControllerType": "1",
"ControllerKey": "Account",
"IsAvailableInTouch": false,
"IsConfirmationTokenRequired": false,
"Markup": "<apex:page standardController=\"Account\">Test</apex:page>",
"CreatedDate": "2015-07-06T20:43:55.000+0000",
"CreatedById": "005o0000001V9OXAA0",
"LastModifiedDate": "2015-07-06T20:44:53.000+0000",
"LastModifiedById": "005o0000001V9OXAA0",
"SystemModstamp": "2015-07-06T20:44:53.000+0000"
}
Stripping out the Dates etc... and changing the Name I still got the original error POSTing this back to create a new ApexClass.
So I'd conclude that this is a bug in the Tooling API. Especially as it works if the standardController isn't defined.
Previously I'd encountered problems with the Tooling API where it couldn't create the initial records (See How do I use the Tooling API to create a new Apex Trigger?). You may need to create the New ApexClass using the standard REST API rather than the Tooling API.